中序遍历 (Inorder Traversal)

inorder(root.right, res); 这行代码的作用是 递归遍历右子树


完整执行顺序

中序遍历 (Inorder Traversal) 中,访问节点的顺序是:

  1. 遍历左子树
  2. 访问当前节点
  3. 遍历右子树

代码如下:

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
递归执行过程
步骤递归调用说明
1inorder(1)根节点 1
2inorder(2)递归进入左子树 2
3inorder(4)递归进入左子树 4
4res.add(4)4 没有左子树,访问 4
5res.add(2)回到 2,访问 2
6inorder(5)递归进入右子树 5
7res.add(5)5 没有左子树,访问 5
8res.add(1)回到 1,访问 1
9inorder(3)递归进入右子树 3
10res.add(3)3 没有左子树,访问 3

最终 res = [4, 2, 5, 1, 3],符合中序遍历顺序(左 -> 根 -> 右)。


示例 2:只有右子树

    1
     \
      2
       \
        3

递归过程

  1. inorder(1),左子树为空,直接 res.add(1)
  2. inorder(2),左子树为空,直接 res.add(2)
  3. inorder(3),左子树为空,直接 res.add(3)

最终结果 res = [1, 2, 3],符合中序遍历


示例 3:只有左子树

    3
   /
  2
 /
1

递归过程

  1. inorder(3),先递归 inorder(2)
  2. inorder(2),先递归 inorder(1)
  3. inorder(1),左子树为空,直接 res.add(1)
  4. 回到 2res.add(2)
  5. 回到 3res.add(3)

最终结果 res = [1, 2, 3],符合中序遍历


总结

inorder(root.right, res); 负责遍历 当前节点的右子树,保证了 左 -> 根 -> 右 的顺序:

  • 没有右子树 → 直接返回,不执行右子树递归。
  • 有右子树 → 递归进入右子树,继续按 inorder() 方式遍历。

这个步骤保证了 完整的中序遍历,如果缺少它,所有右子树的节点都会被跳过,导致结果错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值