小学生都能懂的题解 | #二叉搜索树与双向链表#
二叉搜索树与双向链表
https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5
故事背景
想象你有一堆不同大小的彩色球,你希望把这些球按照从小到大的顺序串成一条美丽的项链。但是,这条项链有一个特殊的地方:它可以从两端串起,也就是说,你可以从最小的球开始串,也可以从最大的球开始串。
我们的树
我们的树就像一个有很多层的蛋糕,每一层都有一个数字,而且每层的数字都是按照一定的顺序排列的。例如:
10 / \ 6 14 / \ / \ 4 8 12 16
在这个树中,数字是按照从小到大的顺序排列的,左边的数字总是比右边的数字小。
我们的目标
我们的目标是把这些数字按照从小到大的顺序串成一条项链,项链上的每个球都可以前后串起。
如何实现
让我们用一个故事来说明这个过程:
- 找到最小的球:
- 我们从树的顶部开始,一直往左走,直到找到最小的球。
- 在这个例子中,最小的球是数字4。
- 串项链:
- 找到最小的球之后,我们开始串项链。
- 我们先把这个球放在项链的最前面。
- 找下一个球:
- 我们再去找下一个数字更大的球,然后把这个球串在项链的后面。
- 一直这样做,直到所有的球都被串起来。
代码解释
让我们看看具体的代码实现:
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; } }
不抽象的解释
- 找到最小的球:
- 我们先从树的最左边开始,找到最小的球。
- 就像是在森林里找到最矮的一棵树。
- 串第一个球:
- 如果还没有串第一个球,那么当前球就是项链的第一个球。
- 串下一个球:
- 把当前球串在上一个球的后面,同时也要让上一个球知道它后面是谁。
- 记住当前球:
- 记住当前球,因为下一个要串的球就是它。
- 处理右边的球:
- 继续处理右边的球,直到所有的球都被串起来。
这样,我们就把一棵二叉搜索树转换成了一个排序的双向链表,并且没有创建新的节点,只是调整了原有节点的指针指向。
如果这篇文章对你有帮助,请点个免费的赞👍,让它能够帮助更多的人。
#牛客创作赏金赛#小学生都能看懂的算法 文章被收录于专栏
主要面向小白的算法文章。以小学生都能看懂为目标而编写,顺便巩固下自己。