小学生都能懂的题解 | #二叉搜索树与双向链表#

二叉搜索树与双向链表

https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5

故事背景

想象你有一堆不同大小的彩色球,你希望把这些球按照从小到大的顺序串成一条美丽的项链。但是,这条项链有一个特殊的地方:它可以从两端串起,也就是说,你可以从最小的球开始串,也可以从最大的球开始串。

我们的树

我们的树就像一个有很多层的蛋糕,每一层都有一个数字,而且每层的数字都是按照一定的顺序排列的。例如:

       10
      /  \
     6   14
    / \  / \
   4  8 12 16

在这个树中,数字是按照从小到大的顺序排列的,左边的数字总是比右边的数字小。

我们的目标

我们的目标是把这些数字按照从小到大的顺序串成一条项链,项链上的每个球都可以前后串起。

如何实现

让我们用一个故事来说明这个过程:

  1. 找到最小的球:
  2. 我们从树的顶部开始,一直往左走,直到找到最小的球。
  3. 在这个例子中,最小的球是数字4。
  4. 串项链:
  5. 找到最小的球之后,我们开始串项链。
  6. 我们先把这个球放在项链的最前面。
  7. 找下一个球:
  8. 我们再去找下一个数字更大的球,然后把这个球串在项链的后面。
  9. 一直这样做,直到所有的球都被串起来。

代码解释

让我们看看具体的代码实现:

class TreeNode {
    int val;
    TreeNode left, right;

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

public class Solution {
    // 我们的项链的第一个球
    private TreeNode head = null;

    // 上一个串好的球
    private TreeNode prev = null;

    // 把树变成项链的方法
    public TreeNode convertBiNode(TreeNode root) {
        if (root != null) {
            // 先处理左边的球
            convertBiNode(root.left);

            // 如果还没有串第一个球,那么当前球就是第一个球
            if (prev == null) {
                head = root;
            } else {
                // 把当前球串在上一个球后面
                root.left = prev;
                prev.right = root;
            }

            // 记住当前球作为下一个要串的球
            prev = root;

            // 处理右边的球
            convertBiNode(root.right);
        }

        // 返回项链的第一个球
        return head;
    }
}

不抽象的解释

  1. 找到最小的球:
  2. 我们先从树的最左边开始,找到最小的球。
  3. 就像是在森林里找到最矮的一棵树。
  4. 串第一个球:
  5. 如果还没有串第一个球,那么当前球就是项链的第一个球。
  6. 串下一个球:
  7. 把当前球串在上一个球的后面,同时也要让上一个球知道它后面是谁。
  8. 记住当前球:
  9. 记住当前球,因为下一个要串的球就是它。
  10. 处理右边的球:
  11. 继续处理右边的球,直到所有的球都被串起来。

这样,我们就把一棵二叉搜索树转换成了一个排序的双向链表,并且没有创建新的节点,只是调整了原有节点的指针指向。

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

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

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

全部评论

相关推荐

10-09 09:39
门头沟学院 C++
HHHHaos:这也太虚了,工资就一半是真的
点赞 评论 收藏
分享
11-15 17:19
湖南大学 Java
成果成果成果果:这是哪个公司的hr,这么离谱吗,我没见过用性别卡技术岗的,身边女性同学拿大厂offer的比比皆是
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务