【Lintcode】177. Convert Sorted Array to Binary Search Tree With Minimal Height

题目地址:

https://www.lintcode.com/problem/convert-sorted-array-to-binary-search-tree-with-minimal-height/description

给定一个升序数组 A A ,将其转化为一棵BST,要求高度达到最小。

可以用递归解决。取 A [ m i d ] A[mid] 作为树根, A [ m i d ] A[mid] A A 的中间数,然后递归建立左子树和右子树,接在root上即可。代码如下:

public class Solution {
    /*
     * @param A: an integer array
     * @return: A tree node
     */
    public TreeNode sortedArrayToBST(int[] A) {
        // write your code here
        return buildTree(A, 0, A.length - 1);
    }
    
    private TreeNode buildTree(int[] A, int l, int r) {
        if (l > r) {
            return null;
        }
        
        int m = l + (r - l >> 1);
        TreeNode root = new TreeNode(A[m]);
        root.left = buildTree(A, l, m - 1);
        root.right = buildTree(A, m + 1, r);
        return root;
    }
}

class TreeNode {
    int val;
    TreeNode left, right;
    TreeNode(int x) {
        val = x;
    }
}

时间复杂度 O ( n ) O(n) ,空间 O ( log n ) O(\log n)

首先我们可以用数学归纳法证明建立出来的树确实是BST。接着我们先证明这个树是平衡的(含义是对于其每个子树,左右子树节点个数之差绝对值不超过 1 1 )。数学归纳法:当 [ l , r ] = 0 |[l,r]|=0 或者 [ l , r ] = 1 |[l,r]|=1 ,结论成立。假设结论对于 [ l , r ] = k |[l,r]|=k 时成立,当 [ l , r ] = k + 1 |[l,r]|=k+1 ,如果 k + 1 k+1 是奇数,那么 m m 取的正好是数组正中央的数的下标,据数学归纳法,左右子树分别都是平衡的,整棵树也是平衡的,所以结论成立;而如果 k + 1 k+1 是偶数,那么 m m 取的是数组正中央偏左的数的下标,此时左子树节点数比右子树小 1 1 ,仍然是对的。所以结论对任何 n n 都对。

接着我们证明,即使对于一般的树,当树平衡时,其高度是最小的。也可以用数学归纳法证明。当树的节点个数是 0 , 1 , 2 0,1,2 时结论成立;假设对于 k k 个节点的树结论也成立,当树有 k + 1 k+1 个节点时,假设其左右子树分别有 u u v v 个节点,那么显然由数学归纳法,左右子树各自都是平衡的时候,整个树的高度最小。设树根为 r o o t root ,左右子树分别为 l l r r ,设 d ( r o o t ) d(root) 表示以 r o o t root 为根的树的高度。如果 u v > 1 u-v>1 的话,那么有 u > u 1 v + 1 u>u-1\ge v+1 ,所以 d ( r ) = 1 + max ( d ( l ) , d ( r ) ) d(r)=1+\max(d(l),d(r)) 假设将左子树移一个节点到右子树去后左右子树分别为 l l' r r' ,则左子树比右子树节点数仍然多至少 1 1 ,所以 d ( r ) d ( r ) d ( l ) d ( l ) d(r)\le d(r')\le d(l')\le d(l) ,也就是树的高度会变小。所以当树平衡时,其高度是最小的。

发布了387 篇原创文章 · 获赞 0 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_46105170/article/details/105465819