思路一:在数据结构中,我们曾经学到过这样一个东西:二分搜索树(不是BST),这个树是根据二分搜索的搜索顺序而画出来的树。这棵树的特点就是它是绝对平衡的,并且是有序的。既然我们可以根据二分搜索的顺序来构建平衡二叉搜索树,那么我们就可以将原数组排成二分搜索此数组的顺序,这里用了集合容器作为额外空间存储。至于二分搜索的顺序模拟,是根据分冶来的。
然后就是树的构建,是数据结构的基础。注意:我们在写树的创建函数时,一定要返回一个值,因为我们的结点在创建以后并不会归到树中,需要我们人为的赋给这个空指针结点才行,不然会不存在。
这一种思路写起来其实挺麻烦的,但是思路很清晰。另外就是因为作者认为,这棵树需要实时是平衡二叉树才行,刚开始还把思路向着旋转那里去想了,结果手写特别麻烦,就没有采用那种思路。后来发现只要构建的树最后是平衡的就行,而不需要在创建的时候就一步一步都得是平衡树。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
List<Integer>list=new ArrayList<>();
public TreeNode sortedArrayToBST(int[] nums) {
if(nums.length<=0)
return null;
finds(nums);
TreeNode root=new TreeNode(nums[nums.length/2],null,null);
if(nums.length!=2){
for(int i=1;i<list.size();i++){
create(root,list.get(i));
}
return root;
}
else{
for(int i=0;i<list.size();i++){
create(root,list.get(i));
}
return root;
}
}
public void finds(int []nums){
if(nums.length<=0)
return;
if(nums.length==1){
list.add(nums[0]);
return;
}
if(nums.length==2){
list.add(nums[0]);
list.add(nums[1]);
return;
}
list.add(nums[nums.length/2]);
int []left=new int[nums.length/2];
int []right=new int[nums.length-nums.length/2-1];
for(int i=0;i<nums.length/2;i++){
left[i]=nums[i];
}
int k=0;
for(int i=nums.length/2+1;i<nums.length;i++){
right[k++]=nums[i];
}
finds(left);
finds(right);
}
public TreeNode create(TreeNode root,int val){
if(root==null){
TreeNode tmp=new TreeNode(val,null,null);
return tmp;
}
if(root.val>val){
root.left=create(root.left,val);
}
else if(root.val<val){
root.right=create(root.right,val);
}
return root;
}
}
思路二:因为二叉搜索树的中序遍历正是一个升序的序列,所以我们可以任取一个结点,它的左边就是左子树,右边就是右子树。但又因为需要平衡,所以我们选择中间结点作为根,这样可以保证左右结点平衡,可以通过分冶递归实现。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return fenye(nums,0,nums.length-1);
}
public TreeNode fenye(int []nums,int l,int r){
if(l>r)return null;
int mid=l+(r-l)/2;
TreeNode root=new TreeNode(nums[mid]);
root.left=fenye(nums,l,mid-1);
root.right=fenye(nums,mid+1,r);
return root;
}
}