题目描述
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
示例 1:
输入: nums = [1,3]
输出: [3,1]
解释: [1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。
分析
对于给定的nums数组,我们可以将数组最中间的元素作为我们的根节点,左边的数作为左子树,右边的数作为右子树,然后分别的左右两边的数进行上述操作,就可以实现平衡二叉树。以上是总的思路,接下来我们一步一步分析。
- 我们肯定需要进行递归操作,题目所给的函数参数不利于我们实现二叉树,自定义个函数fn,明确函数的返回类型,题目要求返回二叉树,即返回TreeNode* 类型的根节点,于是fn函数类型应该是struct TreeNode*,再明确函数的参数,我们是对题目给的nums数组进行左右两边分别递归,于是参数自然有nums,以及左右两个位置的起始值。
struct TreeNode* fn(int* nums,int left,int right){
return ;
}
- 明确递归结束的条件,当left > right 时,表示该节点已经是叶子节点了,return NULL即可。
struct TreeNode* fn(int* nums,int left,int right){
if(left>right) return NULL;
return ;
}
- 首先定义一个mid=(left+right)/2,作为每次创建子树的根节点的值,再申请一个root空间,用来存放根节点信息,根节点定义完成,再对节点的左右子树分别递归调用,最后返回根节点root。
实现代码
struct TreeNode* fn(int* nums,int left,int right){
if(left>right) return NULL;
int mid = (left + right) / 2;
struct TreeNode* root = (struct TreeNode*) malloc(sizeof (struct TreeNode));
root->val = nums[mid];
root->left = fn(nums,left,mid-1);
root->right = fn(nums,mid+1,right);
return root;
}
struct TreeNode* sortedArrayToBST(int* nums, int numsSize){
return fn(nums,0,numsSize-1);
}