题解 | #二叉树的中序遍历#

二叉树的中序遍历

https://www.nowcoder.com/practice/0bf071c135e64ee2a027783b80bf781d

故事背景

想象你在一个迷宫里探险,这个迷宫是由许多房间组成的。每个房间都有一个号码,有的房间有两个门,分别通往左边的房间和右边的房间。你的任务是按照一定的顺序记录下每个房间的号码。这种顺序叫做“中序遍历”。

游戏规则

中序遍历的规则很简单:

  1. 先去看看左边的房间(如果有的话)。
  2. 然后记下当前房间的号码
  3. 再去看看右边的房间(如果有的话)。

示例

让我们通过一个简单的例子来理解这个过程:

示例 1

假设迷宫是这样的:

    1
   / \
  2   3

按照中序遍历的规则,我们应该这样记录:

  1. 先去看看 1 的左孩子 2
  2. 然后记下 2 的号码。
  3. 回到 1,记下 1 的号码。
  4. 再去看看 1 的右孩子 3
  5. 最后记下 3 的号码。

最终的结果应该是:[2, 1, 3]

示例代码

现在我们用Java来实现这个过程:

import java.util.ArrayList;
import java.util.List;

// 定义二叉树节点
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x;
    }
}

public class BinaryTreeInorderTraversal {

    /**
     * 中序遍历
     * @param root 二叉树的根节点
     * @return 节点值的中序遍历结果(作为 int[] 数组)
     */
    public int[] inorderTraversal(TreeNode root) {
        if(root = null){
			return new int[0];
		}
        List<Integer> result = new ArrayList<>();
        traverse(root, result);
        
        // 将 List 转换为 int[] 数组
        int[] resultArray = new int[result.size()];
        for (int i = 0; i < result.size(); i++) {
            resultArray[i] = result.get(i);
        }
        
        return resultArray;
    }

    /**
     * 辅助方法,用于递归遍历
     * @param node 当前节点
     * @param list 用于存储结果的列表
     */
    private void traverse(TreeNode node, List<Integer> list) {
        if (node == null) {
            return;
        }

        // 先去看看左边的房间
        traverse(node.left, list);

        // 然后记下当前房间的号码
        list.add(node.val);

        // 再去看看右边的房间
        traverse(node.right, list);
    }

}

解释

  1. 定义二叉树节点:
  2. 使用 TreeNode 类来表示二叉树的节点,每个节点包含一个值 val 和两个指向左右孩子的指针 left 和 right。
  3. 中序遍历方法:
  4. inorderTraversal 方法接收一个 TreeNode 类型的参数 root,表示二叉树的根节点。
  5. 使用一个 ArrayList 类型的列表 result 来存储遍历的结果。
  6. 辅助遍历方法:
  7. traverse 方法用于递归地遍历二叉树。
  8. 如果当前节点为空,直接返回。先递归遍历当前节点的左子树。
  9. 访问当前节点,将其值添加到结果列表中。
  10. 最后递归遍历当前节点的右子树。
  11. 主方法:
  12. 在 main 方法中创建了几个示例二叉树,并调用 inorderTraversal 方法获取结果。
  13. 使用 Arrays.toString 方法将 int[] 数组转换为字符串表示形式,便于输出查看。

测试结果

对于每个示例:

  • 示例 1:[2, 1, 3]
  • 示例 2:[]
  • 示例 3:[2, 1]
  • 示例 4:[1, 2]

如果这篇文章对你有帮助,请点个免费的赞👍,让它能够帮助更多的人。

#牛客创作赏金赛#
小学生都能看懂的算法 文章被收录于专栏

主要面向小白的算法文章。以小学生都能看懂为目标而编写,顺便巩固下自己。

全部评论

相关推荐

仁者伍敌:难怪小公司那么挑剔,让你们这些大佬把位置拿了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 12:31
以前小时候我最痛恨出轨、偷情的人,无论男女,为什么会出轨?现在我成了自己最讨厌的人,没想到分享的东西在牛客会被这么多人看,大家的评价都很中肯,我也认同,想过一一回复,但我还是收声了,我想我应该说说这件事,这件事一直压在我心里,是个很大的心结,上面说了人为什么出轨,我大概能明白了。我们大一下半年开始恋爱,开始恋爱,我给出了我铭记3年的承诺,我对她好一辈子,我永远不会背叛,我责任心太重,我觉得跟了我,我就要照顾她一辈子,我们在一起3年我都没有碰过她,她说往东我就往东,她说什么我做什么,她要我干什么,我就干什么!在学校很美好,中途也出过一些小插曲,比如男闺蜜、男闺蜜2号等等等。但我都强迫她改掉了,我...
牛客刘北:两个缺爱的人是没有办法好好在一起的,但世界上哪有什么是非对错?你后悔你们在一起了,但是刚刚在一起的美好也是真的呀,因为其他人的出现,你开始想要了最开始的自己,你的确对不起自己,21岁的你望高物远,你完全可以不谈恋爱,去过你想要的生活,你向往自由,在一起之后,你要想的不是一个人,而是两个人,你不是变心了,就像你说的,你受够了,你不想包容了,冷静几天是你最优的选择,爱人先爱己。
社会教会你的第一课
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务