将有序数组转换为二叉搜索树(力扣第108题)

题目:

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

示例:

给定有序数组: [-10,-3,0,5,9],

一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:

      0
     / 
   -3   9
   /   /
 -10  5

分析:

  要求必须是高度平衡的二叉搜索树,那么必须遵循的硬性条件就是:

    1、任何非叶子节点的左右子树的高度差的绝对值不超过1;

    2、任何非叶子节点的值要大于其左子节点的值,同时小于其右边子节点的值。

  题目给的是有序数组,那么划分元素的大小的时候就能很好划分,构建BST的时候采用二分法进行划分,因为对于一个BST来说,对其进行中序遍历得到一个结果数组,排在最中间的元素一定是根节点,对于其中的子树来说也是同样的道理。对给的有序数组进行二分划分的时候,从第一次划分开始,第一次取到的中间元素作为根节点,剩余的左半部分和右半部分分别作为根节点的两棵子树,两个部分对应于有序数组的[0,mid)和(mid,length-1],然后根据数组的这两个部分分别再次对两棵子树进行二分法划分构建BST子树。

  因为采用的是二分法划分有序数组,每次经过划分,左右部分的元素数量最多相差一个,那么也就意味着所有非叶子节点的左右子树的节点数量最多相差一个,那么就能保证从上往下构造BST树的时候,所有非叶子节点的左右子树的高度差的绝对值至多为1。

代码:

    public TreeNode sortedArrayToBST(int[] nums) {

        if ( nums == null || nums.length == 0 ){
            return null;
        }

        return createBST(nums,0,nums.length - 1 );
    }

    private TreeNode createBST(int[] nums,int left,int right ){

        if ( left > right ){
            return null;
        }

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

        TreeNode rootNode = new TreeNode(nums[mid]);

        rootNode.left = createBST(nums,left,mid - 1);
        rootNode.right = createBST(nums,mid + 1,right);

        return rootNode;
    }
原文地址:https://www.cnblogs.com/yxym2016/p/13632276.html