解法一:迭代法
前序遍历先读取root.val,然后按root.right, root.left的顺序压栈。这样在出栈时会先访问left,然后时right。后续遍历参照这种方式,按root.left, root.right的顺序压栈,即迭代顺序为”中右左”,最终将结果倒序即可,变为”左中右”。
# 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 = rightclass Solution:def preorderTraversal(self, root: TreeNode) -> List[int]:ans = []if not root:return ansstack = [root]while stack:root = stack.pop()ans.append(root.val)if root.right:stack.append(root.right)if root.left:stack.append(root.left)return ansdef inorderTraversal(self, root: TreeNode) -> List[int]:ans = []if not root:return ansp = rootstack = []while p or stack:# 将p入栈,继续访问其左子树if p:stack.append(p)p = p.left# 当p为空,即没有左子树可以访问时,p从stack中取到其上一层,访问val# 然后再访问右子树else:p = stack.pop()ans.append(p.val)p = p.rightreturn ansdef postorderTraversal(self, root: TreeNode) -> List[int]:ans = []if not root:return ansstack = [root]while stack:root = stack.pop()ans.append(root.val)if root.left:stack.append(root.left)if root.right:stack.append(root.right)return ans[::-1]
