1、递归写法
class Solution:
def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
result = []
def dfs(node):
if node is None:
return
result.append(node.val)
dfs(node.left)
dfs(node.right)
dfs(root)
return result
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
result = []
def dfs(node):
if node is None:
return
dfs(node.left)
result.append(node.val)
dfs(node.right)
dfs(root)
return result
def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
result = []
def dfs(node):
if node is None:
return
dfs(node.left)
dfs(node.right)
result.append(node.val)
dfs(root)
return result
递归三要素:
1、确定递归参数和返回值
def dfs(node):
2、确定终止条件
if node is None:
return
3、确定单层递归的逻辑
dfs(node.left)
dfs(node.right)
result.append(node.val)
2、迭代写法
class Solution:
def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
if not root:return []
result = []
stack = [root]
while stack:
node = stack.pop()
result.append(node.val)
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return result
def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
if not root:return []
result = []
stack = [root]
while stack:
node = stack.pop()
result.append(node.val)
if node.left:
stack.append(node.left)
if node.right:
stack.append(node.right)
return result[::-1]
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
result = []
stack = []
cur = root
while cur or stack:
if cur:
stack.append(cur)
cur = cur.left
else:
cur = stack.pop()
result.append(cur.val)
cur = cur.right
return result
for 前序遍历:中左右
1、判断根节点是否为空
2、取出栈顶元素,并写入列表
3、分别将右孩子,左孩子压入栈中(因为栈先进后出,所以右孩子先进)
for 后序遍历:左右中
后序遍历的思路近似前序遍历,左右中进行一个reverse就是中右左,所以只需要调换入栈顺序,并最后反转列表即可
for 中序遍历:左中右
中序遍历比较麻烦/(ㄒoㄒ)/~~,
1、先迭代访问最左节点
2、找到最左节点后处理栈顶
3、取栈顶右节点