leetcode第144、94、145——二叉樹的前序遍歷、中序遍歷、後序遍歷
阿新 • • 發佈:2021-01-24
1.前序遍歷
給你二叉樹的根節點 root ,返回它節點值的 前序 遍歷。
示例 1:
輸入:root = [1,null,2,3]
輸出:[1,2,3]
1.1 遞迴解法
# Definition for a binary tree node.
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
遞迴解法
if root is None:
return []
res = [root.val]
if root.left:
res.extend(self.preorderTraversal(root.left))
if root.right:
res.extend(self. preorderTraversal(root.right))
return res
1.2 迭代解法
# Definition for a binary tree node.
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
# 迭代解法
if root is None:
return []
res = []
stack = [root]
while stack:
a = stack.pop()
if a:
res.append(a.val)
# 棧先進後出,所以先壓入右子樹再壓入左子樹
if a.right:
stack.append(a.right)
if a.left:
stack.append(a.left)
return res
2.中序遍歷
給定一個二叉樹的根節點 root ,返回它的 中序
遍歷。
輸入:root = [1,null,2,3]
輸出:[1,3,2]
2.1 遞迴解法
# Definition for a binary tree node.
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
# 1.遞迴解法
if root is None:
return []
res = []
res.extend(self.inorderTraversal(root.left))
res.append(root.val)
res.extend(self.inorderTraversal(root.right))
return res
2.2 迭代解法
# Definition for a binary tree node.
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
# 2.迭代解法
if root is None:
return []
res = []
t = type(root)
stack = [root]
while stack:
a = stack.pop()
if type(a) != t and a is not None:
# 如果a不是樹,且a不為空,則代表a是val值,新增到結果列表
res.append(a)
continue
if a:
# 中序遍歷順序: 左、根、右,故入棧順序為: 右、根、左
stack.append(a.right)
stack.append(a.val)
stack.append(a.left)
return res
3.後續遍歷
給定一個二叉樹,返回它的 後序 遍歷。
示例:
輸入: [1,null,2,3]
輸出: [3,2,1]
3.1 遞迴解法
# Definition for a binary tree node.
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
# 1.遞迴解法
if root is None:
return []
res = []
res.extend(self.postorderTraversal(root.left))
res.extend(self.postorderTraversal(root.right))
res.append(root.val)
return res
3.2 迭代解法
# Definition for a binary tree node.
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
# 2.迭代解法
if root is None:
return []
t = type(root)
res = []
stack = [root]
while stack:
a = stack.pop()
if type(a) != t and a is not None:
# a型別不是樹,且不為空,表示是val
res.append(a)
continue
if a:
# 後續遍歷順序: 左、右、根。故入棧順序應該為: 根、右、左
stack.append(a.val)
stack.append(a.right)
stack.append(a.left)
return res