返回
二叉搜索树的逆袭:打卡 LeetCode 99 恢复二叉搜索树
后端
2023-10-03 07:34:14
在算法训练营的征途中,打卡了 LeetCode 99:恢复二叉搜索树,这道题目考验了我们在二叉搜索树上的操作功底。二叉搜索树是一种高效有序的数据结构,它以其极快的搜索效率著称,广泛应用于实际开发中。
LeetCode 99 的题目要求我们恢复一棵已被破坏的二叉搜索树。想象一下,这棵树就像一本精心排列的字典,却在某个时刻遭遇了混乱,页面散落,顺序错乱。我们的任务就是充当数据修复师,通过一系列巧妙的操作,将它恢复成井然有序的状态。
理解算法
算法的本质是找出被颠倒的两对节点。这两对节点一定满足以下条件:
- 第一对节点:左节点的值大于右节点的值。
- 第二对节点:左节点的值小于右节点的值。
具体步骤
-
中序遍历二叉树 :使用中序遍历,将所有节点的值收集到一个数组中。中序遍历的顺序为:左子树、根节点、右子树。
-
找出被颠倒的节点 :从收集到的数组中找出违反二叉搜索树性质的两个节点,即它们的顺序不对。
-
交换节点值 :将这两个节点的值进行交换,恢复二叉搜索树的正确顺序。
代码实现
以下是用 Java 实现的代码示例:
public class RecoverBinarySearchTree {
private TreeNode first;
private TreeNode second;
private TreeNode prev;
public void recoverTree(TreeNode root) {
if (root == null) {
return;
}
inorder(root);
// 交换两个节点的值
int temp = first.val;
first.val = second.val;
second.val = temp;
}
private void inorder(TreeNode root) {
if (root == null) {
return;
}
inorder(root.left);
// 找到第一个被颠倒的节点
if (prev != null && prev.val > root.val) {
if (first == null) {
first = prev;
}
second = root;
}
prev = root;
inorder(root.right);
}
}
算法复杂度
- 时间复杂度:O(n),其中 n 为二叉搜索树中的节点数。
- 空间复杂度:O(n),用于存储中序遍历结果的数组。
实战应用
恢复二叉搜索树算法在实际开发中有着广泛的应用场景,如:
- 数据修复 :修复损坏或混乱的数据结构。
- 文件排序 :将无序的文件内容按特定顺序进行排序。
- 数据库索引优化 :通过恢复二叉搜索树索引,提高数据库查询效率。
掌握二叉搜索树的恢复算法,不仅能提升我们的算法能力,还能开阔我们对数据结构和算法应用的理解。通过 LeetCode 99 的训练,我们再次解锁了一项利器,在算法进阶的道路上迈出了一大步!