当前位置:   article > 正文

LeetCode(Python)—— 二叉树的中序遍历(简单)_python二叉树中序遍历

python二叉树中序遍历

二叉树的中序遍历

概述:给定一个二叉树的根节点 root ,返回它的中序遍历

  1. 输入:root = [1,null,2,3]
  2. 输出:[1,3,2]
  3. 输入:root = []
  4. 输出:[]
  5. 输入:root = [1]
  6. 输出:[1]

方法一:递归

思路:按照访问左子树——根节点——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。

  1. # 递归
  2. class Solution:
  3. def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
  4. if not root:
  5. return []
  6. left = self.inorderTraversal(root.left)
  7. right = self.inorderTraversal(root.right)
  8. return left + [root.val] + right
  9. # 递归另外一种写法
  10. class Solution:
  11. def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
  12. def inorder(root:TreeNode):
  13. if not root: # 空树
  14. return []
  15. inorder(root.left)
  16. res.append(root.val)
  17. inorder(root.right)
  18. res = []
  19. inorder(root)
  20. return res

方法二:迭代

思路:递归函数我们也可以用迭代的方式实现,两种方式是等价的,区别在于递归的时候隐式地维护了一个栈,而我们在迭代的时候需要显式地将这个栈模拟出来,其他都相同。

  1. # 迭代
  2. class Solution:
  3. def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
  4. res = []
  5. if not root: # 空树
  6. return []
  7. stack = [] # 隐形栈
  8. while stack or root:
  9. while root:
  10. stack.append(root) # 节点入栈
  11. root = root.left
  12. root = stack.pop() # 节点弹栈
  13. res.append(root.val)
  14. root = root.right
  15. return res
  16. # 迭代另外一种写法
  17. class Solution:
  18. def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
  19. stack = []
  20. def add_all_left(node):
  21. while node:
  22. stack.append(node)
  23. node = node.left
  24. res = []
  25. add_all_left(root)
  26. while stack:
  27. node = stack.pop()
  28. res.append(node.val)
  29. add_all_left(node.right)
  30. return res

方法三:Morris 中序遍历

思路:Morris 遍历算法是另一种遍历二叉树的方法。如果 x 无左孩子,先将 x 的值加入答案数组,再访问 x 的右孩子,即 x = x.right。如果 x 有左孩子,则找到 x 左子树上最右的节点(即左子树中序遍历的最后一个节点,x 在中序遍历中的前驱节点),我们记为 predecessor。根据 predecessor 的右孩子是否为空,进行如下操作。如果 predecessor 的右孩子为空,则将其右孩子指向 x,然后访问 x 的左孩子,即 x = x.left。如果 predecessor 的右孩子不为空,则此时其右孩子指向 x,说明我们已经遍历完 x 的左子树,我们将 predecessor 的右孩子置空,将 x 的值加入答案数组,然后访问 x 的右孩子,即 x = x.right。

  1. # Morris 中序遍历
  2. class Solution:
  3. def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
  4. res = []
  5. while root:
  6. if root.left:
  7. predecessor = root.left
  8. while predecessor.right:
  9. predecessor = predecessor.right
  10. predecessor.right = root
  11. temp = root
  12. root = root.left
  13. temp.left = None
  14. else:
  15. res.append(root.val)
  16. root = root.right
  17. return res

总结

递归真香!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/432764
推荐阅读
相关标签
  

闽ICP备14008679号