4.6
清明前做了一半的题目,今天做出来了。
学到几个小的点,计算log2 的时候 应该是 Math.log(n)/ Math.log(double(2)),还是很麻烦的。
这道题的想法就是,先算出最小的树高,然后就可以找到根节点的位置了。
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @param A: an integer array
* @return: a tree node
*/
public TreeNode sortedArrayToBST(int[] A) {
//TreeNode root = new TreeNode();
if(A.length == 0){
return null;
}
int low = 0;
int height = A.length -1;
return sortedArrayToBST1(A,low,height);
}
public TreeNode sortedArrayToBST1(int[] A,int low,int height) {
//TreeNode root = new TreeNode();
if(low > height){// write your code here
return null;
}
//TreeNode root = new TreeNode();
if(height == low){
TreeNode root = new TreeNode(A[low]);
return root;
}
//System.out.println("height:" + height +" low:" + low);
int level = (int)(Math.log(height - low +1)/Math.log((double)2));
//System.out.println("level:" + level);//高度减一
int flag = (int)Math.pow(2, level)-1;
//System.out.println("flag:" + flag);
TreeNode root = new TreeNode(A[low + flag]);
// System.out.println("root.val:" + root.val);
root.left = sortedArrayToBST1(A,low,low + flag-1);
root.right = sortedArrayToBST1(A,low + flag+1,height);//根节点的位置
return root;
}
}