leetcode题解108-将有序数组转换为二叉排序树

问题描述

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

示例 1:
leetcode题解108-将有序数组转换为二叉排序树_第1张图片

输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

leetcode题解108-将有序数组转换为二叉排序树_第2张图片
示例 2:
leetcode题解108-将有序数组转换为二叉排序树_第3张图片

输入:nums = [1,3]
输出:[3,1]
解释:[1,3] 和 [3,1] 都是高度平衡二叉搜索树。

解题思路:

BST的中序遍历是升序的,因此本题等同于根据中序遍历的序列恢复二叉搜索树。因此我们可以以升序序列中的任一个元素作为根节点,以该元素左边的升序序列构建左子树,以该元素右边的升序序列构建右子树,这样得到的树就是一棵二叉搜索树,又因为本题要求平衡,那么我们可以每次选取中间元素来作为我们的根节点。这样左右两棵子树的高度差值就小于等于1,而一直递归执行这样的过程,最终就可以得到一个高度平衡的二叉排序树。
注意:这里其实也用到了折半查找判定树的思路,折半查找每次将待查找的关键字与中间元素的值作比较。如果小于的话,就往中间元素左边查找,否则,往右边查找。这样,折半查找的过程其实可以用二叉树来描述,这个二叉树是高度平衡的二叉排序树
leetcode题解108-将有序数组转换为二叉排序树_第4张图片

实现代码

class Solution {
     
    public int [] arr;      //保存原有序数组,避免数组传参
    public TreeNode genBinaryTree(int low,int high){
     
        //如果low>high,就没有元素,直接返回空即可
        if(low>high){
     
            return null;
        }
        //如果low==high,待处理序列只有一个元素,这个结点将被作为叶子结点,返回即可
        if(low==high){
     
            TreeNode p=new TreeNode(arr[low]);
            p.left=null;
            p.right=null;
            return p;
        }
        //否则,找到中间元素,然后构造根节点,然后继续完善该结点的左右子树
        int mid=(low+high+1)/2;
        TreeNode p=new TreeNode(arr[mid]);
        p.left=genBinaryTree(low,mid-1);
        p.right=genBinaryTree(mid+1,high);
        return p;
    }
    public TreeNode sortedArrayToBST(int[] nums) {
     
        int len=nums.length;
        arr=new int[len];
        for(int i=0;i;i++){
     
            arr[i]=nums[i];
        }
        return genBinaryTree(0,len-1);
    }
}

leetcode题解108-将有序数组转换为二叉排序树_第5张图片

你可能感兴趣的