二叉树中序遍历:递归与显式栈
351 字
2 分钟
二叉树中序遍历:递归与显式栈
核心结论
中序遍历的顺序是左子树、根节点、右子树。递归实现最直观;当树可能很深、需要主动控制调用栈时,可以使用显式栈完成同样的状态管理。
问题
给定二叉树根节点 root,返回其中序遍历结果。例如 root = [1, null, 2, 3] 的结果为 [1, 3, 2]。
递归实现
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
traverse(root, result);
return result;
}
private void traverse(TreeNode node, List<Integer> result) {
if (node == null) {
return;
}
traverse(node.left, result);
result.add(node.val);
traverse(node.right, result);
}
}
结果列表放在方法内部,避免同一个 Solution 实例被重复调用时残留上一次结果。
迭代实现
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
Deque<TreeNode> stack = new ArrayDeque<>();
TreeNode current = root;
while (current != null || !stack.isEmpty()) {
while (current != null) {
stack.push(current);
current = current.left;
}
current = stack.pop();
result.add(current.val);
current = current.right;
}
return result;
}
}
正确性与复杂度
两种实现都保证每个节点在其左子树之后、右子树之前被加入结果。每个节点访问一次,时间复杂度为 O(n);递归栈或显式栈最多保存树高 h 个节点,空间复杂度为 O(h)。
验证
覆盖空树、单节点、只有左子树、只有右子树,以及完全二叉树。空树必须返回空列表,而不是 null。
参考
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
二叉树中序遍历:递归与显式栈
https://blog.mintalix.com/posts/study-inordertraversal/相关文章智能推荐
1
路径总和 III:树上的前缀和
algorithms用前缀和计数任意起点的向下路径,避免为每个节点重新搜索子树,并说明回溯时恢复计数的原因。
2
最小路径和:压缩二维动态规划
algorithms从只能向右或向下移动的约束推导最小路径和状态转移,并将二维状态表压缩为一维数组。
3
爬楼梯:从递推关系到动态规划
algorithms从最后一步的两种选择推导斐波那契式状态转移,并用常量空间实现爬楼梯方案计数。
4
金字塔转换矩阵:哈希预处理与回溯
algorithms将三元组规则预处理为候选映射,再通过回溯逐层构造金字塔并在无候选时提前剪枝。
5
最小路径和:二维动态规划基础解法
algorithms使用二维动态规划记录到达每个网格的最小代价,讲清边界初始化、状态转移与复杂度。
随机文章随机推荐


