力扣日记1.14-【二叉树篇】108. 将有序数组转换为二叉搜索树

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

力扣日记:【二叉树篇】108. 将有序数组转换为二叉搜索树

日期:2023.1.14
参考:代码随想录、力扣

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

题目描述

难度:简单

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

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

示例 1:
力扣日记1.14-【二叉树篇】108. 将有序数组转换为二叉搜索树,leetcode,算法,职场和发展

输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:
力扣日记1.14-【二叉树篇】108. 将有序数组转换为二叉搜索树,leetcode,算法,职场和发展

示例 2:
力扣日记1.14-【二叉树篇】108. 将有序数组转换为二叉搜索树,leetcode,算法,职场和发展

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

提示:

  • 1 <= nums.length <= 10^4
  • -10^4 <= nums[i] <= 10^4
  • nums 按 严格递增 顺序排列

题解

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
#define SOLUTION 2
public:
#if SOLUTION == 1
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        if (nums.size() == 0)   return nullptr;
        // 中节点的位置
        int index = nums.size() / 2;
        TreeNode* node = new TreeNode(nums[index]);
        // 中节点左边和右边的数组分别作为左右子树去构建(左子树为BST + 右子树为BST -> root为BST)
        // 而且最后一定也是高度平衡二叉树
        vector<int> leftNum(nums.begin(), nums.begin() + index);    // 左子树:[startIdx, endIdx)
        vector<int> rightNum(nums.begin() + index + 1, nums.end()); // 右子树
        node->left = sortedArrayToBST(leftNum); // 左子树(自身也是BST)作为左节点
        node->right = sortedArrayToBST(rightNum); // 右子树(自身也是BST)作为右节点
        return node;
    }
#elif SOLUTION == 2 // 下标索引
    TreeNode* sortedArrayToBST(vector<int>& nums) {     
        return buildTree(nums, 0, nums.size() - 1); // 左闭右闭
    }
    // 循环不变量,左闭右闭 [left, right]
    // 返回值为构造的二叉树的根节点,输入为原始数组以及子数组的起始位置
    TreeNode* buildTree(vector<int>& nums, int left, int right) {
        // 终止条件
        if (left - right > 0)   return nullptr; // 相等也是符合条件的,则index = left
        // 获得子数组的中点位置
        // int index = (left + right) / 2; // 可能溢出
        int index = left + (right - left) / 2;
        TreeNode* node = new TreeNode(nums[index]);
        // 递归左区间
        node->left = buildTree(nums, left, index - 1);  // 左闭右闭
        // 递归右区间
        node->right = buildTree(nums, index + 1, right);    // 左闭右闭
        return node;
    }
#endif
};

复杂度

时间复杂度:
空间复杂度:
力扣日记1.14-【二叉树篇】108. 将有序数组转换为二叉搜索树,leetcode,算法,职场和发展文章来源地址https://www.toymoban.com/news/detail-791393.html

思路总结

  • 构造二叉树本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间。
  • 对于二叉搜索树的有序数组,其数组中点即为分割点
  • 注意在构造二叉树的时候尽量不要重新定义左右区间数组,而是用下标来操作原数组(解法一和解法二)。
  • 按照这种方法构造出二叉搜索树,自然而然就是高度平衡二叉树

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

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

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

相关文章

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

            由数组构造二叉搜索树地问题,本题可以借鉴从中序与后序遍历序列构造二叉树 这道题,这类题 本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间 。         下面直接看代码:

    2024年02月16日
    浏览(36)
  • LeetCode108. 将有序数组转换为二叉搜索树

    108. 将有序数组转换为二叉搜索树 一、题目 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 示例 1: 示例 2: 提示: 1 = nums.

    2024年02月11日
    浏览(30)
  • LeetCode 热题 100 JavaScript--108. 将有序数组转换为二叉搜索树

    给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 提示: 1 = nums.length = 104 -104 = nums[i] = 104 nums 按 严格递增 顺序排列

    2024年02月14日
    浏览(40)
  • LeetCode算法题解|​ 669. 修剪二叉搜索树​、108. 将有序数组转换为二叉搜索树、​538. 把二叉搜索树转换为累加树​

    题目链接:669. 修剪二叉搜索树 题目描述: 给你二叉搜索树的根节点  root  ,同时给定最小边界 low  和最大边界  high 。通过修剪二叉搜索树,使得所有节点的值在 [low, high] 中。修剪树  不应该  改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关

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

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

    2024年02月05日
    浏览(37)
  • 第23天-代码随想录刷题训练-第六章 ● 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树

    - LeetCode 链接 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。 修剪树不应该改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在唯一的答案

    2024年02月05日
    浏览(43)
  • LeetCode——二叉树篇(九)

    刷题顺序及思路来源于代码随想录,网站地址:https://programmercarl.com 目录 669. 修剪二叉搜索树 108. 将有序数组转换为二叉搜索树 538. 把二叉搜索树转换为累加树 给你二叉搜索树的根节点  root  ,同时给定最小边界 low  和最大边界  high 。通过修剪二叉搜索树,使得所有节

    2024年02月11日
    浏览(38)
  • LeetCode——二叉树篇(五)

     刷题顺序及思路来源于代码随想录,网站地址:https://programmercarl.com  目录 404. 左叶子之和 513. 找树左下角的值 递归   迭代 112. 路径总和 113. 路径总和 II 给定二叉树的根节点  root  ,返回所有左叶子之和。 给定一个二叉树的  根节点   root ,请找出该二叉树的  最底

    2024年02月12日
    浏览(40)
  • 数据结构-树和二叉树篇

    思维导图(基于教材) 错题复盘+计算题(基于习题解析) 课后习题 从这章开始,要是上课听不懂的话,推荐去看B站青岛大学王卓王卓老师讲解的很细节,基本上每个知识点十几二十分钟,刚开始看的时候,可能会不习惯王老师的语气词,别退出,视频重要的是老师讲解的

    2024年01月17日
    浏览(48)
  • 代码随想录笔记--二叉树篇

    目录 1--递归遍历 1-1--前序遍历 1-2--中序遍历 1-3--后序遍历 2--迭代遍历 2-1--前序遍历 2-2--后序遍历 2-3--中序遍历 3--二叉树的层序遍历 4--翻转二叉树 5--对称二叉树 6--二叉树最大深度 7--二叉树的最小深度 8--完全二叉树节点的数量 9--平衡二叉树 10--二叉树的所有路径 11--左叶子之

    2024年02月10日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包