例子:
Input: [8,5,1,7,10,12]
Output: [8,5,10,1,7,null,12]
方法1:使用递归的方法,将小于第一个节点的值作为left,大于第一个节点的值作为right,不断递归.
public TreeNode bstFromPreorder(int[] preorder){
int n = preorder.length;
if(n == 0){
return null;
}
int rootValue = preorder[0];
int[] left = new int[n];
int[] right = new int[n];
int leftIndex = 0;
int rightIndex = 0;
for(int i=1; i<n;i++){
if(preorder[i] < rootValue){
left[leftIndex++]= preorder[i];
}else{
right[rightIndex++] = preorder[i];
}
}
TreeNode root = new TreeNode(rootValue);
root.left = bstFromPreorder(Arrays.copyOfRange(left,0,leftIndex));
root.right = bstFromPreoder(Arrays.copyOfRange(right,0,rightIndex));
return root;
}
方法2:一个root,一定满足left以及left的所有子节点的值小于root,right以及right的所有子节点的值大于root,所以借助于变量index,使用一次循环即可完成前序遍历二叉树的构建.
int index = 0;
public TreeNode bstFromPreorder(int[] preorder){
if(preorder == null || preorder.length == 0){
return null;
}
return bstFromPreorderHelper(preorder,Integer.MIN_VALUE,Integer.MAX_VALUE);
}
public TreeNode bstFromPreorderHelper(int[] preorder, int min, int max){
if(index >= preorder.length){
return null;
}
TreeNode node = null;
int key = preorder[index];
if(key > min && key < max){
node = new TreeNode(key);
index++;
node.left = bstFromPreorderHelper(preorder,min,key);
node.right = bstFromPreorderHelper(preorder,key,max);
}
return node;
}