将有序数组转换为二叉树

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

md这个破CSDN模板怎么没了,编辑器也死难用,气死

1、题目

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

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

示例 1:

将有序数组转换为二叉树

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

将有序数组转换为二叉树

示例 2:

将有序数组转换为二叉树

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

2、链接

题目:108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)

视频:构造平衡二叉搜索树!| LeetCode:108.将有序数组转换为二叉搜索树_哔哩哔哩_bilibili

 3、解题思路

那我就瞎写了,希望复习回来的时候自己还记得

典型的双指针法+递归

注意题目给的是平衡二叉树,所以我们只要把这个有序数组nums取中间值作为二叉树的根节点就好了

还要注意的事,使用双指针一定要规定好左右区间,本文我用的是左闭右开--> [left, right)

递归三部曲:

1.确定函数返回值和传入参数

TreeNode* traversal(vector<int>& nums, int left, int right)

2.确定终止条件

这个递归到什么时候结束呢,显而易见是在区间不断缩减的过程中,出现了区间不成立的时候

if (left >= right) return nullptr;

md直到现在我才想通为什么递归最后一层返回的事nullptr,因为最下一层叶子指向的是nullptr啊,return这个关键词告诉程序递归结束,顺便抛出了一个nullptr放在最后一层的下面罢了

3.确定单层递归逻辑

前面说了,找nums这个有序数组的中值作为二叉树的根节点,怎么找呢?

用int mid = (left + right) / 2;?  那可不行,万一right == INT_MAX不就越界了吗。所以应该这样写:int mid = left + ((right - left) / 2);

千万别觉着mid是小数怎么办,小数会被自动向下取整变为整数,莫得影响

        int mid = left + (right - left) / 2; //自动转换小数,向下取整
        TreeNode* root = new TreeNode(nums[mid]);
        root->left = traversal(nums, left, mid);
        root->right = traversal(nums, mid+1, right);
        return root;

展示一下随手画的东西:(这什么破编辑界面都不能旋转图片)

将有序数组转换为二叉树

 递归完就是这个东西:

将有序数组转换为二叉树

 4、全部代码

 最近懒得让AI给我注释代码了,因为的确简单的很,没必要

class Solution {
public:
    //nums取地址的原因是:不取地址每次递归都会重新复制内存,空间消耗大
    TreeNode* traversal (vector<int>& nums, int left, int right) {
        if (left >= right) return nullptr; // [ )
        //int mid = (left + right) / 2; //如果right是int最大值,就会越界
        int mid = left + (right - left) / 2; //自动转换小数,向下取整
        TreeNode* root = new TreeNode(nums[mid]);
        root->left = traversal(nums, left, mid);
        root->right = traversal(nums, mid+1, right);
        return root;
    }
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        TreeNode* root = traversal(nums, 0, nums.size());
        return root;
    }
};

 文章来源地址https://www.toymoban.com/news/detail-449507.html

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

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

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

相关文章

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

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

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

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

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

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

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

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

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

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

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

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

    2024年02月08日
    浏览(35)
  • 数据结构与算法—二叉树数组表示(ArrayBinTree)、二叉树的链式表示(LinkedBinTree)的基于C++模板代码实现

    1、二叉树的顺序表示:ArrayBinTree.h 二叉树的顺序表示法操作方便,但缺点是容易造成存储空间浪费。 这是一个用数组实现的二叉树类模板。它可以创建一个空树,也可以在指定的位置插入结点并设置结点的值,可以删除子树,并支持逐层遍历。使用该类时,需要提供一个元

    2024年02月06日
    浏览(41)
  • 力扣0109——有序链表转换二叉搜索树

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

    2024年02月21日
    浏览(37)
  • 一套模板搞定二叉树算法题--二叉树算法讲解002

    递归: 每个节点 都要恰好被访问一次, 本质上是二叉树的线性化 。 一个树形的结构,线性化为一个数组之类的\\\"串\\\"的结构。 示例二叉树原型图: 前序遍历执行顺序: 根节点--对左子树做前序遍历--对右子树做前序遍历 总的顺序:根节点--左子树--右子树 左子树中:根-左

    2024年02月02日
    浏览(33)
  • 一套模板搞定二叉树算法题--二叉树算法讲解004

    模拟忘记知识点和技巧时,遇到一个新的二叉树习题,该如何处理思考和写代码解题? 题目和题意: 题解1 成员变量self.ans: 题解2 递归回传: 该题是个经典二叉树题目 题目和题意: 题解: 分析,所有路径,每一个叶子节点都需要到达。到达之后,需要退出回到上一层的叶

    2024年02月19日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包