94. 二叉树的中序遍历
https://leetcode-cn.com/problems/binary-tree-inorder-traversal/
解法一:递归
# 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]:
res = []
self.travel(root, res)
return res
def travel(self, root, res): #辅助函数,注意要将结果集作为参数传入,才能在递归中修改结果集
if root:
self.travel(root.left, res)
res.append(root.val)
self.travel(root.right, res)
解法二:用栈。
递归是用函数栈保存信息,因此非递归也要用栈,考虑用栈模拟递归过程,即先递归左子树到底,然后访问根,再递归右子树
用一个工作节点p遍历整棵树。思路是先一直进入左子,直到叶节点,期间将所有路途节点入栈。到达最左叶节点后弹栈,进入右子树。
其实到达最左叶节点不用判断stack是否非空,因为外面大循环while已经保证了stack非空
class Solution:
def inorderTraversal(self, root: TreeNode):
res = []
s = [] #栈
p = root #工作节点
while p or s:
# 找最左子,路上依次入栈
while p:
s.append(p)
p = p.left
# 走到最左子,弹栈
p = s.pop()
res.append(p.val)
#对右子执行如上操作
p = p.right
return res
js:
/**
* @param {TreeNode} root
* @return {number[]}
*/
var inorderTraversal = function(root) {
const res = []
let p = root
const stack = []
while (p || stack.length > 0) {
while (p) {
stack.push(p)
p = p.left
}
p = stack.pop() // 到达最左叶节点就弹栈,访问该节点
res.push(p.val)
p = p.right // 访问该节点右子
}
return res
};
最后更新于