小学生都能懂的题解 | #二叉搜索树与双向链表#
二叉搜索树与双向链表
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;
}
}
不抽象的解释
- 找到最小的球:
- 我们先从树的最左边开始,找到最小的球。
- 就像是在森林里找到最矮的一棵树。
- 串第一个球:
- 如果还没有串第一个球,那么当前球就是项链的第一个球。
- 串下一个球:
- 把当前球串在上一个球的后面,同时也要让上一个球知道它后面是谁。
- 记住当前球:
- 记住当前球,因为下一个要串的球就是它。
- 处理右边的球:
- 继续处理右边的球,直到所有的球都被串起来。
这样,我们就把一棵二叉搜索树转换成了一个排序的双向链表,并且没有创建新的节点,只是调整了原有节点的指针指向。
如果这篇文章对你有帮助,请点个免费的赞👍,让它能够帮助更多的人。
#牛客创作赏金赛#小学生都能看懂的算法 文章被收录于专栏
主要面向小白的算法文章。以小学生都能看懂为目标而编写,顺便巩固下自己。
OPPO成长空间 955人发布