返回

二叉搜索树的逆袭:打卡 LeetCode 99 恢复二叉搜索树

后端

在算法训练营的征途中,打卡了 LeetCode 99:恢复二叉搜索树,这道题目考验了我们在二叉搜索树上的操作功底。二叉搜索树是一种高效有序的数据结构,它以其极快的搜索效率著称,广泛应用于实际开发中。

LeetCode 99 的题目要求我们恢复一棵已被破坏的二叉搜索树。想象一下,这棵树就像一本精心排列的字典,却在某个时刻遭遇了混乱,页面散落,顺序错乱。我们的任务就是充当数据修复师,通过一系列巧妙的操作,将它恢复成井然有序的状态。

理解算法

算法的本质是找出被颠倒的两对节点。这两对节点一定满足以下条件:

  • 第一对节点:左节点的值大于右节点的值。
  • 第二对节点:左节点的值小于右节点的值。

具体步骤

  1. 中序遍历二叉树 :使用中序遍历,将所有节点的值收集到一个数组中。中序遍历的顺序为:左子树、根节点、右子树。

  2. 找出被颠倒的节点 :从收集到的数组中找出违反二叉搜索树性质的两个节点,即它们的顺序不对。

  3. 交换节点值 :将这两个节点的值进行交换,恢复二叉搜索树的正确顺序。

代码实现

以下是用 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 的训练,我们再次解锁了一项利器,在算法进阶的道路上迈出了一大步!