二叉树的递归遍历
递归算法的三个要素:
- 确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数,并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。
- 确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。
- 确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。
144. Binary Tree Preorder Traversal
# 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: Optional[TreeNode]) -> List[int]:
res = []
def traversal(root):
if root == None:
return
res.append(root.val)
traversal(root.left)
traversal(root.right)
traversal(root)
return res
145. Binary Tree Postorder Traversal
# 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: Optional[TreeNode]) -> List[int]:
res = []
def traversal(root):
if root == None:
return
traversal(root.left)
traversal(root.right)
res.append(root.val)
traversal(root)
return res
94. Binary Tree Inorder Traversal
# 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: Optional[TreeNode]) -> List[int]:
res = []
def traversal(root):
if root == None:
return
traversal(root.left)
res.append(root.val)
traversal(root.right)
traversal(root)
return res
二叉树的迭代遍历
144. Binary Tree Preorder Traversal
# 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: Optional[TreeNode]) -> List[int]:
stack = [root]
res = []
if root == None:
return res
while stack:
node = stack.pop()
res.append(node.val)
# 先右后左入栈,出栈时才能先左后右
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return res
145. Binary Tree Postorder Traversal
# 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: Optional[TreeNode]) -> List[int]:
stack = [root]
res = []
if root == None:
return res
while stack:
node = stack.pop()
res.append(node.val)
# 先左后右,出栈时先右后左
if node.left:
stack.append(node.left)
if node.right:
stack.append(node.right)
# 此时,res为'中右左',reverse后为'左右中'
res.reverse()
return res
94. Binary Tree Inorder Traversal
# 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: Optional[TreeNode]) -> List[int]:
stack = []
res = []
cur = root
while stack or cur != None:
if cur != None: # 指针来访问节点,访问到最底层
stack.append(cur)
cur = cur.left # 左
else:
cur = stack.pop()
res.append(cur.val) # 中
cur = cur.right # 右
return res