打卡题目:leetcode第94题,二叉树的中序遍历
    相似题目:144、145
    注意:一定要掌握二叉树最常见的遍历方式,一定要明确前序、中序、后序(这里的前中后指的是根节点的遍历顺序)。除了递归方法,最好再理解和掌握非递归方法。
    image.png


    【思路】
    前序遍历、中序遍历、后序遍历,这三种遍历方式中,前中后指的都是根节点的顺序,并且都是先遍历左子树、再遍历右子树。

    • 中序遍历递归解法:先递归遍历左子树,再访问当前节点的值,最后递归遍历右子树。
    • 中序遍历非递归解法:
      • 使用两个栈,一个栈(栈1)存储节点,另一个栈(栈2)存储访问标签。要想实现左根右的顺序,则需要先插入右节点,再插入根节点,最后插入左节点
      • 实现步骤为:如果栈1的栈顶节点没被访问,则弹出该节点,并将右孩子节点(若有)加入栈中,将该节点加入栈,最后将左孩子节点(若有)加入栈中;同时栈2加入对应的是否被访问的标签。

    【代码】

    • 递归解法

      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 traverse(self, node):
      9. if not node:
      10. return
      11. # 左根右
      12. self.traverse(node.left)
      13. self.res.append(node.val)
      14. self.traverse(node.right)
      15. def inorderTraversal(self, root: TreeNode) -> List[int]:
      16. self.res = []
      17. self.traverse(root)
      18. return self.res
    • 非递归解法

      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 inorderTraversal(self, root: TreeNode) -> List[int]:
      9. '''非递归遍历'''
      10. if not root:
      11. return []
      12. stack = [root]
      13. visit = [0]
      14. res = []
      15. while len(stack) > 0:
      16. # 已经遍历过,将val放到res中
      17. if visit[-1] == 1:
      18. res.append(stack.pop().val)
      19. visit.pop()
      20. # 未遍历过,则遍历左右节点(由于是栈,先保存右节点,再保存左节点)
      21. else:
      22. node.stack.pop()
      23. visit_i = visit.pop()
      24. if node.right:
      25. stack.append(node.right)
      26. visit.append(0)
      27. stack.append(node)
      28. visit.append(1)
      29. if node.left:
      30. stack.append(node.left)
      31. visit.append(0)
      32. return res