解法一:迭代法

前序遍历先读取root.val,然后按root.right, root.left的顺序压栈。这样在出栈时会先访问left,然后时right。后续遍历参照这种方式,按root.left, root.right的顺序压栈,即迭代顺序为”中右左”,最终将结果倒序即可,变为”左中右”。

  1. # Definition for a binary tree node.
  2. # class TreeNode:
  3. # def __init__(self, val=0, left=None, right=None):
  4. # self.val = val
  5. # self.left = left
  6. # self.right = right
  7. class Solution:
  8. def preorderTraversal(self, root: TreeNode) -> List[int]:
  9. ans = []
  10. if not root:
  11. return ans
  12. stack = [root]
  13. while stack:
  14. root = stack.pop()
  15. ans.append(root.val)
  16. if root.right:
  17. stack.append(root.right)
  18. if root.left:
  19. stack.append(root.left)
  20. return ans
  21. def inorderTraversal(self, root: TreeNode) -> List[int]:
  22. ans = []
  23. if not root:
  24. return ans
  25. p = root
  26. stack = []
  27. while p or stack:
  28. # 将p入栈,继续访问其左子树
  29. if p:
  30. stack.append(p)
  31. p = p.left
  32. # 当p为空,即没有左子树可以访问时,p从stack中取到其上一层,访问val
  33. # 然后再访问右子树
  34. else:
  35. p = stack.pop()
  36. ans.append(p.val)
  37. p = p.right
  38. return ans
  39. def postorderTraversal(self, root: TreeNode) -> List[int]:
  40. ans = []
  41. if not root:
  42. return ans
  43. stack = [root]
  44. while stack:
  45. root = stack.pop()
  46. ans.append(root.val)
  47. if root.left:
  48. stack.append(root.left)
  49. if root.right:
  50. stack.append(root.right)
  51. return ans[::-1]