举一反三之将BST变平衡

授人以鱼只救一时之急,

授人以渔则可解一生之需.

1. 二叉搜索树

二叉搜索树 (Binary Search Tree),又被称为二叉排序树,二叉查找树。
其特点是:

  1. 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
  2. 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
  3. 任意节点的左、右子树也分别为二叉搜索树;

二叉搜索树(BST)的中序遍历是递增序列。(PS: 解题常备)

二叉搜索树相比于其他数据结构的优势在于查找、插入的时间复杂度较低。最优是O(log n),最差是O(n)

2. 平衡二叉树

平衡二叉树(Balanced BinaryTree)又被称为AVL树。它具有以下性质:

它是一棵空树或它的左右子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。


题目

1382. 将二叉搜索树变平衡

给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树.

要想解决这道题,我们首先要具备以下知识:

  1. 二叉搜索树的性质(中序遍历是递增序列);
  2. 平衡的定义(左右子树的高度差 <= 1);
  3. 技能——将有序序列转换为平衡的BST;

代码实现

class Solution {
    
    
    
    List<Integer> inorders = new ArrayList<>();

    public TreeNode balanceBST(TreeNode root) {
    
    
        if(root == null){
    
    
            return null;
        }
        // 1. 通过中序遍历获得有序序列
        inorder(root);
        // 2. 构建平衡的二叉搜索树
        return buildTree(0,inorders.size()-1);
    }

    // 根据有序序列构建平衡的二叉搜索树
    public TreeNode buildTree(int left,int right){
    
    
        if(left > right){
    
    
            return null;
        }

        int mid = left + (right - left) / 2;

        TreeNode root = new TreeNode(inorders.get(mid));

        root.left = buildTree(left,mid-1);

        root.right = buildTree(mid+1,right);

        return root;
    }

    // 因为中序遍历不是本题的考察点,故这里采用 "递归版本"的中序遍历
    public void inorder(TreeNode root){
    
    
        if(root == null){
    
    
            return;
        }

        inorder(root.left);
        inorders.add(root.val);
        inorder(root.right);
    }
}

未雨绸缪

  1. 94. 二叉树的中序遍历(inorder)

  2. 110. 平衡二叉树

  3. 108. 将有序数组转换为二叉搜索树

猜你喜欢

转载自blog.csdn.net/wangcheeng/article/details/123024955