题目
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
题目补充
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
二叉搜索树(二叉排序树 / 二叉查找树):如果树不为空的情况下需要满足以下条件
- 非空左子树的所有键值小于其根结点的键值。
- 非空右子树的所有键值大于其根结点的键值。
- 左、右子树都是二叉搜索树。
思路
在遍历二叉搜索树的时候,如果是中序遍历,得到的序列就是递增有序的。
所以这道题就是根据有序序列来回复一个二叉搜索树。
但是题目要求 高平衡
可以看下面的图:
三棵树的都是二叉搜素树,三棵树的中序遍历都是 1 2 3 4 5,但是都符合题意吗?
答案是否定的。
如何保证得到的是高平衡的二叉搜索树呢?我们需要定义这棵二叉搜索树的根节点是有序序列的 中间值 。
代码实现
/**
* 二叉搜索树
* @param nums
* @return
*/
public TreeNode sortedArrayToBST(int[] nums) {
return mid_sort(nums,0,nums.length-1); //调用递归
}
/**
* 二叉搜索树 递归方法
* @param nums 有序数组
* @param low 数组最小值下标
* @param hight 数组最大值下标
* @return
*/
public TreeNode mid_sort(int[] nums,int low,int hight){
if(low > hight){ //递归结束条件 最小值下标大于最大值下标
return null;
}
int mid = low + (hight - low)/2; //计算中间值下标(防计算越界)
TreeNode root = new TreeNode(nums[mid]); //创建二叉搜索树节点为中间值
root.left = mid_sort(nums,low,mid - 1); //递归创建左子树
root.right = mid_sort(nums,mid + 1,hight); //递归创建右子树
return root;
}
总结
主要理解了二叉树创建的过程,加深了递归的理解。