inorder(root.right, res);
这行代码的作用是 递归遍历右子树。
完整执行顺序
在 中序遍历 (Inorder Traversal) 中,访问节点的顺序是:
- 遍历左子树
- 访问当前节点
- 遍历右子树
代码如下:
public void inorder(TreeNode root, List<Integer> res) {
if (root == null) { // 递归终止条件
return;
}
inorder(root.left, res); // 递归遍历左子树
res.add(root.val); // 访问当前节点
inorder(root.right, res); // 递归遍历右子树
}
其中,inorder(root.right, res);
这行代码的作用是 递归进入右子树,并按照相同的方式继续遍历。
示例分析
示例 1:完整二叉树
假设有如下二叉树:
1
/ \
2 3
/ \
4 5
递归执行过程
步骤 | 递归调用 | 说明 |
---|---|---|
1 | inorder(1) | 根节点 1 |
2 | inorder(2) | 递归进入左子树 2 |
3 | inorder(4) | 递归进入左子树 4 |
4 | res.add(4) | 4 没有左子树,访问 4 |
5 | res.add(2) | 回到 2 ,访问 2 |
6 | inorder(5) | 递归进入右子树 5 |
7 | res.add(5) | 5 没有左子树,访问 5 |
8 | res.add(1) | 回到 1 ,访问 1 |
9 | inorder(3) | 递归进入右子树 3 |
10 | res.add(3) | 3 没有左子树,访问 3 |
最终 res = [4, 2, 5, 1, 3]
,符合中序遍历顺序(左 -> 根 -> 右)。
示例 2:只有右子树
1
\
2
\
3
递归过程
inorder(1)
,左子树为空,直接res.add(1)
inorder(2)
,左子树为空,直接res.add(2)
inorder(3)
,左子树为空,直接res.add(3)
最终结果 res = [1, 2, 3]
,符合中序遍历。
示例 3:只有左子树
3
/
2
/
1
递归过程
inorder(3)
,先递归inorder(2)
inorder(2)
,先递归inorder(1)
inorder(1)
,左子树为空,直接res.add(1)
- 回到
2
,res.add(2)
- 回到
3
,res.add(3)
最终结果 res = [1, 2, 3]
,符合中序遍历。
总结
inorder(root.right, res);
负责遍历 当前节点的右子树,保证了 左 -> 根 -> 右 的顺序:
- 没有右子树 → 直接返回,不执行右子树递归。
- 有右子树 → 递归进入右子树,继续按
inorder()
方式遍历。
这个步骤保证了 完整的中序遍历,如果缺少它,所有右子树的节点都会被跳过,导致结果错误。