题目地址:
给定一个升序数组 ,将其转化为一棵BST,要求高度达到最小。
可以用递归解决。取 作为树根, 是 的中间数,然后递归建立左子树和右子树,接在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;
}
}
时间复杂度 ,空间 。
首先我们可以用数学归纳法证明建立出来的树确实是BST。接着我们先证明这个树是平衡的(含义是对于其每个子树,左右子树节点个数之差绝对值不超过 )。数学归纳法:当 或者 ,结论成立。假设结论对于 时成立,当 ,如果 是奇数,那么 取的正好是数组正中央的数的下标,据数学归纳法,左右子树分别都是平衡的,整棵树也是平衡的,所以结论成立;而如果 是偶数,那么 取的是数组正中央偏左的数的下标,此时左子树节点数比右子树小 ,仍然是对的。所以结论对任何 都对。
接着我们证明,即使对于一般的树,当树平衡时,其高度是最小的。也可以用数学归纳法证明。当树的节点个数是 时结论成立;假设对于 个节点的树结论也成立,当树有 个节点时,假设其左右子树分别有 和 个节点,那么显然由数学归纳法,左右子树各自都是平衡的时候,整个树的高度最小。设树根为 ,左右子树分别为 和 ,设 表示以 为根的树的高度。如果 的话,那么有 ,所以 假设将左子树移一个节点到右子树去后左右子树分别为 和 ,则左子树比右子树节点数仍然多至少 ,所以 ,也就是树的高度会变小。所以当树平衡时,其高度是最小的。