题目
Given an array where elements are sorted in ascending order, convert it to a height balanced BST.
分析
将二叉查找树进行中序遍历,就可以得到一个升序排序的数组,因此,一个已经排序的数组可以看做一个中序遍历得到的数组,要得到一个高度平衡的二叉查找树,可以使得左右子树的节点数尽可能相等。因此,可以采用二分法将数组分为两个子数组,中间值作为父节点,左边的子数组作为左子树,右边的子数组作为右子树进行递归,这样就可以得到一个高度平衡的二叉查找树。
代码
public class TreeNode {
int value;
TreeNode left;
TreeNode right;
TreeNode(int value) {
this.value = value;
}
public static TreeNode sortedArrayToBST(int[] num) {
return helper(0, num.length - 1, num);
}
private static TreeNode helper(int i, int j, int[] num) {
if (i > j)
return null;
else if (i == j) {
return new TreeNode(num[i]);
} else {
int mid = (i + j + 1) / 2;
TreeNode node = new TreeNode(num[mid]);
node.left = helper(i, mid - 1, num);
node.right = helper(mid + 1, j, num);
return node;
}
}
@Override
public String toString() {
return printTree(this,0);
}
private String printTree(TreeNode node,int depth) {
StringBuilder result = new StringBuilder();
result.append(printSpace(depth));
result.append(node.value);
result.append("\n");
TreeNode left = node.left;
if(left!=null) {
result.append(printTree(left, depth+1));
}
TreeNode right = node.right;
if(right!=null) {
result.append(printTree(right, depth+1));
}
return result.toString();
}
private String printSpace(int depth) {
StringBuilder result = new StringBuilder();
for (int i = 0; i < depth; i++) {
result.append("\t");
}
return result.toString();
}
public static void main(String[] args) {
int arr[]= { 1, 2, 4, 3, 6, 8 };
Arrays.sort(arr);
TreeNode tree = sortedArrayToBST(arr);
System.out.println(tree);
}
}
转载自http://blog.csdn.net/zh_ang_lei/article/details/72814814