题目
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。
image
解题思路
我们知道,一个二叉搜索树的中序遍历就是一个排序的数组,所以这道题的意思就是,给定一个二叉搜索树的中序遍历,构建出一个平衡的二叉搜索树。
构建一个树,过程肯定是先构建出根节点,然后构建左右子节点,不断的递归这个过程。
public TreeNode sortedArrayToBST(int[] nums) {
//伪代码
TreeNode root = new TreeNode();
root.left = sortedArrayToBST();
root.right = sortedArrayToBST();
return root;
}
这个就是大体的过程,通过描述的,我们肯定要先找到子问题,我们先从一个只有两层的搜索树看起
先看上面的树,给定的排序数组是 -3 0 9
我们怎么构建呢,肯定要找到中间的组,这样就达到了平衡的要求,因为两边的元素数量相等。就得到了下面的子问题代码。
//输入的元素数量只有三个
public TreeNode sortedArrayToBST(int[] nums) {
return sort(nums,0,2);
}
public TreeNode sort(int[] nums,int start,int end){
TreeNode root=null;
if(end - start > 2){
int index = (start + end)/2;
root = new TreeNode(nums[index]);
//递归的构建左右节点
root.left=sort(nums,start,index-1);
root.right=sort(nums,index+1,end);
}else{
root = new TreeNode(nums[start]);
}
return root;
}
因为每一颗大的搜索树都是一个个小的搜索树组成的,所以我们只要不断的拆分这个排序的数组,不断的拆分成3个一组,不够数量的那么就是左右为空。不断的递归这个过程,自地向上,就完成了这个搜索树的构建。
public TreeNode sortedArrayToBST(int[] nums) {
if(nums==null||nums.length==0){
return null;
}
return sort(nums,0,nums.length-1);
}
public TreeNode sort(int[] nums,int start,int end){
TreeNode root=null;
if(end - start > 2){
//需要继续拆分
int index = (start + end)/2;
root = new TreeNode(nums[index]);
root.left=sort(nums,start,index-1);
root.right=sort(nums,index+1,end);
}else{
//不用拆分了,直接创建左右子节点
if(start==end){
root=new TreeNode(nums[start]);
}else if(end-start==1){
root = new TreeNode(nums[end]);
root.left = new TreeNode(nums[start]);
}else{
root = new TreeNode(nums[(start+end)/2]);
root.left = new TreeNode(nums[start]);
root.right = new TreeNode(nums[end]);
}
}
return root;
}
网友评论