94. 二叉树的中序遍历
题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/binary-tree-inorder-traversal
题目
给定一个二叉树,返回它的 中序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
解题思路
思路:递归、迭代(借助栈)
递归
关于中序遍历,我们了解到的说法可能是这样的:先遍历左子树,然后访问根节点,最后遍历左子树。不能说错,但是其中还是存在些许的歧义,下面两篇文章篇幅涉及遍历方面存在歧义的情况,有兴趣可以点击下方链接进行了解,(以下两篇文章来源: 笨猪爆破组)
「手画图解」用栈模拟中序遍历,怎么做以及为什么 | 递归与迭代
先说中序遍历的输出顺序,这一点我们可能会记住类似【左根右】的口诀,也就是左子树、根、左子树。
二叉树的中序遍历,在遍历时会先访问根节点,然后是左子树,再是右子树,只不过处理节点值是放在访问完左子树之后(这就是区别于先序、后序遍历的地方)。而在访问左子树或右子树的时候,还是会以同样的方式去遍历。那么这里我们就可以考虑使用递归去解决。
根据上面的分析,这里直接放代码:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
def inorder(root):
if not root:
return
inorder(root.left)
# 递归完左子树后,处理节点值
ans.append(root.val)
inorder(root.right)
ans = []
inorder(root)
return ans
迭代(栈)
进阶中提及,是否能够用迭代的方法实现?
这里我们需要借助栈模拟递归来实现迭代。
这里直接用图示来说明,如何去用栈模拟递归,如下:
根据上面图示思路,实现代码如下。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
ans = []
stack = []
while stack or root:
if root:
# 这部分将左子树压入栈中
stack.append(root)
root = root.left
else:
# 进入右子树前处理值
tmp = stack.pop()
ans.append(tmp.val)
# 进入右子树,继续循环
root = tmp.right
return ans
欢迎关注
公众号 【书所集录】