LeetCode108. 将有序数组转换为二叉搜索树

这篇具有很好参考价值的文章主要介绍了LeetCode108. 将有序数组转换为二叉搜索树。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

108. 将有序数组转换为二叉搜索树

一、题目

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

示例 1:

LeetCode108. 将有序数组转换为二叉搜索树,LeetCode刷题,算法,LeetCode,二叉树,数据结构

输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

示例 2:

LeetCode108. 将有序数组转换为二叉搜索树,LeetCode刷题,算法,LeetCode,二叉树,数据结构

输入:nums = [1,3]
输出:[3,1]
解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums严格递增 顺序排列
二、题解
方法一:递归

我们知道平衡二叉搜索树的特点是每个节点的左子树和右子树的高度差不超过1,因此我们尽可能要让节点两端的元素个数相近。

算法思路:

  1. 首先,我们要找到一个合适的根节点。由于给定的数组是有序的,我们可以选择中间位置的元素作为根节点,这样可以保证左右子树的元素数量相差不大,从而有助于维持平衡性质。

  2. 在选择了根节点之后,我们将数组分成两部分:左子数组和右子数组。左子数组中的元素都小于根节点,右子数组中的元素都大于根节点。

  3. 然后,我们递归地对左子数组和右子数组进行相同的操作,分别构建左子树和右子树。这样就能保证左右子树的高度差不超过1。

  4. 最后,将根节点与构建好的左右子树连接起来,形成一棵完整的平衡二叉搜索树。

具体实现:

class Solution {
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        if(nums.size() == 0) return nullptr; // 空数组直接返回空指针(终止条件)
        int size = nums.size();
        int middle = size/2; // 找到中间位置的索引
        TreeNode *root = new TreeNode(nums[middle]); // 创建根节点
        vector<int> vecL(nums.begin(),nums.begin()+middle); // 左子数组
        vector<int> vecR(nums.begin()+middle+1, nums.end()); // 右子数组
        root->left = sortedArrayToBST(vecL); // 递归构建左子树
        root->right = sortedArrayToBST(vecR); // 递归构建右子树
        return root; // 返回根节点
    }
};

算法分析:

  • 时间复杂度:每个元素都会被遍历一次,因此总的时间复杂度为 O(n),其中 n 是数组中的元素数量。
  • 空间复杂度:每次递归都会创建新的左右子数组,因此递归的最大深度是 log(n),每层需要的空间为 O(n),所以总的空间复杂度为 O(nlogn)。
方法二:迭代

以下是代码的思路:

  1. 首先,检查给定的有序数组是否为空,如果为空,则直接返回空指针,表示空树。

  2. 创建一个根节点 root,暂时将其值设为0,作为占位值。然后创建三个队列:nodeQue 用于存储待处理的节点,leftQue 用于存储每个节点对应的左区间下标,rightQue 用于存储每个节点对应的右区间下标。

  3. 将根节点 root、左区间下标0和右区间下标 nums.size() - 1 分别入队列。

  4. 进入迭代循环,从队列中取出一个待处理的节点 curNode,同时获取它对应的左区间下标 left 和右区间下标 right,计算当前区间的中间位置 mid

  5. 将中间位置 mid 对应的元素值赋给当前节点 curNode->val,此时树的结构仍未构建。

  6. 如果左区间 left 小于等于 mid - 1,则创建左子节点,并将其入队列。更新 leftQuerightQue 分别为 leftmid - 1

  7. 如果右区间 right 大于等于 mid + 1,则创建右子节点,并将其入队列。更新 leftQuemid + 1,并维持 rightQue 不变。

  8. 重复以上步骤,直到队列为空,此时所有的节点都已经处理完毕,构建的二叉搜索树也完成。

  9. 返回根节点 root,即完成了整个构建过程。文章来源地址https://www.toymoban.com/news/detail-668590.html

class Solution {
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        if (nums.empty()) {
            return nullptr;
        }

        TreeNode* root = new TreeNode(0);   // 初始根节点,暂时使用0作为占位值
        queue<TreeNode*> nodeQue;           // 存储待处理的节点
        queue<int> leftQue;                 // 存储当前节点对应的左区间下标
        queue<int> rightQue;                // 存储当前节点对应的右区间下标
        nodeQue.push(root);                 // 根节点入队列
        leftQue.push(0);                    // 0为初始左区间下标
        rightQue.push(nums.size() - 1);     // nums.size() - 1为初始右区间下标

        while (!nodeQue.empty()) {
            TreeNode* curNode = nodeQue.front(); nodeQue.pop();// 当前待处理节点
            int left = leftQue.front(); leftQue.pop();    // 当前节点对应的左区间下标
            int right = rightQue.front(); rightQue.pop(); // 当前节点对应的右区间下标
            int mid = left + (right - left) / 2;  // 计算当前区间的中间位置

            curNode->val = nums[mid];   // 将中间位置元素赋值给当前节点,此时树的结构仍未构建

            if (left <= mid - 1) {  // 如果左区间仍有元素可用,创建左子节点
                curNode->left = new TreeNode(0);  
                nodeQue.push(curNode->left);  // 将左子节点加入待处理队列
                leftQue.push(left);   // 更新左区间下标
                rightQue.push(mid - 1); // 更新右区间下标
            }

            if (right >= mid + 1) { // 如果右区间仍有元素可用,创建右子节点
                curNode->right = new TreeNode(0); 
                nodeQue.push(curNode->right); // 将右子节点加入待处理队列
                leftQue.push(mid + 1); // 更新左区间下标
                rightQue.push(right);  // 更新右区间下标
            }
        }
        return root; 
    }
};

到了这里,关于LeetCode108. 将有序数组转换为二叉搜索树的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法题】108. 将有序数组转换为二叉搜索树

    给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 示例 1: 输入:nums = [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,nul

    2024年02月20日
    浏览(29)
  • 力扣日记1.14-【二叉树篇】108. 将有序数组转换为二叉搜索树

    日期:2023.1.14 参考:代码随想录、力扣 题目描述 难度:简单 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 示例 1: 输入:

    2024年02月01日
    浏览(28)
  • 力扣 108 将有序数组转化为二叉搜索树

    目录 题目描述: 代码部分: (1)第一种方法  (2)第二种方法 题目解析: (1)复杂度与思想 (2)进阶分析: 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高

    2024年02月08日
    浏览(28)
  • 算法刷题Day 23 修剪二叉搜索树+将有序数组转换为二叉搜索树+把二叉搜索树转换为累加树

    递归 好神奇,完全凭感觉写,感觉应该过不了,结果就过了 具体是什么原理可以参考代码随想录的讲解 递归 迭代 使用三个队列来处理(感觉用三个栈也可以) 其实就是以右-中-左的顺序来处理二叉树 每次将当前节点加上上一次访问节点的新值 能想到保存前一次访问节点的

    2024年02月15日
    浏览(33)
  • HOT42-将有序数组转换为二叉搜索树

          leetcode原题链接 :将有序数组转换为二叉搜索树        上一篇 :HOT41-二叉树的层序遍历       下一篇 :HOT43-验证二叉搜索树         给你一个整数数组  nums  ,其中元素已经按  升序  排列,请你将其转换为一棵  高度平衡  二叉搜索树。 高度平衡  二叉树是一

    2024年02月12日
    浏览(29)
  • 将有序数组转换为二叉树

    md这个破CSDN模板怎么没了,编辑器也死难用,气死 给你一个整数数组  nums  ,其中元素已经按  升序  排列,请你将其转换为一棵  高度平衡  二叉搜索树。 高度平衡  二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 示例 1: 示例 2:

    2024年02月05日
    浏览(25)
  • ( “树” 之 BST) 109. 有序链表转换二叉搜索树 ——【Leetcode每日一题】

    二叉查找树(BST):根节点大于等于左子树所有节点,小于等于右子树所有节点。 二叉查找树中序遍历有序。 给定一个单链表的头节点 head ,其中的元素 按升序排序 ,将其转换为高度平衡的二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子

    2023年04月23日
    浏览(29)
  • 力扣0109——有序链表转换二叉搜索树

    难度: 中等 给定一个单链表的头节点 head ,其中的元素 按升序排序 ,将其转换为高度平衡的二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。 输入: head = [-10,-3,0,5,9] 输出: [0,-3,9,-10,null,5] 解释: 一个可能的答案是[0,-

    2024年02月21日
    浏览(29)
  • LeetCode刷题集(三)(26 删除有序数组中的重复项)

    基本掌握LeetCode中的26删除有序数组中的重复项 题目描述: 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。 由于在某些语言中不能改变数组的长度,所以必须将结果放

    2023年04月17日
    浏览(30)
  • OJ练习第137题——有序链表转换二叉搜索树

    力扣链接:109. 有序链表转换二叉搜索树 给定一个单链表的头节点 head ,其中的元素 按升序排序 ,将其转换为高度平衡的二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。 来源:力扣(LeetCode) 链接:https://leetcode.cn/

    2024年02月16日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包