- 递归(前中后)
class Solution:
def Traversal(self, root: Optional[TreeNode]) -> List[int]:
def dfs(root: TreeNode):
if not root:
return
# #前序遍历 # #中序遍历 # #后序遍历
res.append(root.val) # dfs(root.left) # dfs(root.left)
dfs(root.left) # res.append(root.val) # dfs(root.right)
dfs(root.right) # dfs(root.right) # res.append(root.val)
res=[]
dfs(root)
return res
时间复杂度:O(n),n为节点数,访问每个节点恰好一次。
空间复杂度:空间复杂度:O(h),h为树的高度。最坏情况下需要空间O(n),平均情况为O(logn)
- 迭代(前中后层)
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
res = []
stack = []
cur = root
# 中序,模板:先用指针找到每颗子树的最左下角,然后进行进出栈操作
while stack or cur:
while cur:
stack.append(cur)
cur = cur.left #最左节点都进栈
cur = stack.pop()
res.append(cur.val)
cur = cur.right
return res
# # 前序,相同模板
# while stack or cur:
# while cur:
# res.append(cur.val)
# stack.append(cur)
# cur = cur.left
# cur = stack.pop()
# cur = cur.right
# return res
# # 后序,相同模板
# while stack or cur:
# while cur:
# res.append(cur.val)
# stack.append(cur)
# cur = cur.right
# cur = stack.pop()
# cur = cur.left
# return res[::-1]
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:
return []
cur, res=[root], []
while cur:
lay, layval=[],[]
for node in cur:
layval.append(node.val)
if node.left: lay.append(node.left)
if node.right: lay.append(node.right)
cur=lay
res.append(layval)
return res
时间复杂度:O(n),n为节点数,访问每个节点恰好一次。
空间复杂度:O(h),h为树的高度。取决于树的结构,最坏情况存储整棵树,即O(n)
力扣 144. 二叉树的前序遍历
力扣 94. 二叉树的中序遍历
力扣 145. 二叉树的后序遍历
力扣 102. 二叉树的层序遍历