LeetCode 25:将有序数组转换为二叉搜索树

在这里插入图片描述

  1. 二叉搜索树(BST):整个二叉树的每个结点都满足其左子树上的所有结点值小于其自身的值,右子树上的所有结点值大于其自身的值,对二叉搜索树进行中序遍历得到的结果为升序数组
  2. 中序遍历:即按照左子树,根,右子树的顺序进行遍历得到的结果,并且其左右子树也要以中序的方式遍历
  3. 思路:题目中给出的数组已经是升序排列,所以即是对要求的二叉树的中序遍历结果。题目又要求需要平衡二叉树,所以每次要找到给定数组的中间元素作为根结点,而根节点左边需要的子树由中间元素左边的子数组构成,右边的子树由中间元素右边的子数组构成,使用递归进行构建即可,函数主要逻辑为:
    找到数组中间元素
    将中间元素左边元素放入数组l
    将中间元素右边元素放入数组r
    创建新结点n,n中数据为中间元素
    递归调用自身并传入l数组构建n的左子树
    递归调用自身并传入r数组构建n的右子树
    返回新结点
class Solution 
{
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) 
    {
    	//传入数组为空
        if (nums.empty()) return NULL;
        //存放中间元素左右两部分的元素
        vector<int> left_nums, right_nums;
        //中间元素下标
        int mid = nums.size() * 0.5;
        for (int i = 0; i < nums.size(); i++)
        {
            if (i < mid)
            	//放入左边元素
                left_nums.push_back(nums[i]);
            else if (i > mid)
            	//放入右边元素
                right_nums.push_back(nums[i]);
        }
        //用中间元素的值创建新结点
        TreeNode* node= new TreeNode(nums[mid]);
        //当左边有元素时,递归构建左子树
        if(!left_nums.empty())
            node->left = sortedArrayToBST(left_nums);
        //当右边有元素时,递归构建右子树
        if(!right_nums.empty())
            node->right = sortedArrayToBST(right_nums);
        //返回创建的新结点
        return node;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值