leetcode 108 将有序数组转换成二叉搜索树

题目:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/submissions/

思路一:递归法(前序遍历创建二叉搜索树)

分析:
因为数组是有序的数组,所以一般取数组的中间值作为根节点的值,创建根节点,中间值左面的是左子树,右面的是右子树,对左子树和右子树按照相同的套路进行分析
在这里插入图片描述

用两个指针(用变量表示)指向数组的头和尾,找到数组的中间值(madium),则就是树的根节点,创建根节点;然后由数组的中间值得到树的左子树(【left,madium】)和右子树(【madium+1,right】),在左子树区间和右子树区间按照相同的方式分别找根节点
注意:
1、这里的区间采用左闭右开的方式
2、因为区间的长度可能为偶数也可能为奇数,为奇数时只有一个中间值,为偶数时有两 个中间值,这里是取的右边那个作为中间值
3、在递归过程之中必须保持区间都是采用左闭右开的方式

步骤:

  1. 递归函数
  • 函数参数和返回值

    函数参数为数组,左下标、右下标(用于指示哪些部分属于左右子树);因为用函数的返回值来构建中间结点的左右子节点,所以函数返回值为节点

  • 终止的条件

    当左下标大于等于右下标时,递归结束,返回空

  • 单层逻辑

    根据左下标和右下标求出中间节点的位置
    创建中间节点
    递归左子树,其返回值为根节点的左子树
    递归右子树,其返回值为根节点的右子树
    返回根节点

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;
       
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值