题目:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/submissions/
思路一:递归法(前序遍历创建二叉搜索树)
分析:
因为数组是有序的数组,所以一般取数组的中间值作为根节点的值,创建根节点,中间值左面的是左子树,右面的是右子树,对左子树和右子树按照相同的套路进行分析
用两个指针(用变量表示)指向数组的头和尾,找到数组的中间值(madium),则就是树的根节点,创建根节点;然后由数组的中间值得到树的左子树(【left,madium】)和右子树(【madium+1,right】),在左子树区间和右子树区间按照相同的方式分别找根节点
注意:
1、这里的区间采用左闭右开的方式
2、因为区间的长度可能为偶数也可能为奇数,为奇数时只有一个中间值,为偶数时有两 个中间值,这里是取的右边那个作为中间值
3、在递归过程之中必须保持区间都是采用左闭右开的方式
步骤:
- 递归函数
-
函数参数和返回值
函数参数为数组,左下标、右下标(用于指示哪些部分属于左右子树);因为用函数的返回值来构建中间结点的左右子节点,所以函数返回值为节点
-
终止的条件
当左下标大于等于右下标时,递归结束,返回空
-
单层逻辑
根据左下标和右下标求出中间节点的位置
创建中间节点
递归左子树,其返回值为根节点的左子树
递归右子树,其返回值为根节点的右子树
返回根节点
2.在目标函数调用递归函数
3. 返回根节点
class Solution {
private:
TreeNode* traversal(vector<int>& nums,int left,int right)
{
if(left>=right)
return NULL;
int len=right+left;
int madium=len/2;
TreeNode*root=new TreeNode(nums[madium]);
root->left=traversal(nums,left,madium);
root->right=traversal(nums,madium+1,right);
return root;
}
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
int len=nums.size();
if(len==0)
return NULL;
TreeNode*root=traversal(nums,0,len);
return root;
}
};