数组构造⼆叉树,构成平衡树是⾃然⽽然的事情。本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间。

本题其实要⽐⼆叉树:构造⼆叉树登场! 和 ⼆叉树:构造⼀棵最⼤的⼆叉树简单⼀些,因为有序数组构造⼆叉搜索树,寻找分割点就⽐较容易了。

分割点就是数组中间位置的节点。
那么为问题来了,如果数组⻓度为偶数,中间节点有两个,取哪⼀个?
取哪⼀个都可以,只不过构成了不同的平衡⼆叉搜索树。

递归

1、确定递归函数返回值及其参数
除⼆叉树节点,增加⼆叉树节点,都是⽤递归函数的返回值来完成,这样是⽐较⽅便。那么本题要构造⼆叉树,依然⽤递归函数的返回值来构造中节点的左右孩⼦。

再来看参数,⾸先是传⼊数组,然后就是左下表left和右下表right,我们在⼆叉树:构造⼆叉树登场! 中提过,在构造⼆叉树的时候尽量不要重新定义左右区间数组,⽽是⽤下表来操作原数组。

// 左闭右闭区间[left, right] 也可以左闭右开
TreeNode* traversal(vector<int>& nums, int left, int right)

2、确定递归终⽌条件

这⾥定义的是左闭右闭的区间,所以当区间 left > right的时候,就是空节点了。
if (left > right) return nullptr;

3、确定单层递归的逻辑
⾸先取数组中间元素的位置,不难写出 int mid = (left + right) / 2; , 这么写其实有⼀个问题,就是数值越界,例如left和right都是最⼤int,这么操作就越界了,在⼆分法中尤其需要注意!
所以可以这么写: int mid = left + ((right - left) / 2);相当于是如果数组⻓度为偶数,中间位置有两个元素,取靠左边的。
但本题leetcode的测试数据并不会越界,所以怎么写都可以。但需要有这个意识!

取了中间位置,就开始以中间位置的元素构造节点,代码: TreeNode* root = new TreeNode(nums[mid]); 。
接着划分区间, root的左孩⼦接住下⼀层左区间的构造节点,右孩⼦接住下⼀层右区间构造的节点。
最后返回root节点,单层递归整体代码如下:

 TreeNode* traversal(vector<int>& nums,int left,int right){if(left>right) return nullptr;int rootvalue=nums[(right+left)/2];int delimit=(right+left)/2;TreeNode* root=new TreeNode(rootvalue);root->left=traversal(nums,left,delimit-1);root->right=traversal(nums,delimit+1,right);return root;
class Solution {private:TreeNode* traversal(vector<int>& nums,int left,int right){if(left>right) return nullptr;int rootvalue=nums[(right+left)/2];int delimit=(right+left)/2;TreeNode* root=new TreeNode(rootvalue);root->left=traversal(nums,left,delimit-1);root->right=traversal(nums,delimit+1,right);return root;}
public:TreeNode* sortedArrayToBST(vector<int>& nums) {return traversal(nums,0,nums.size()-1);}
};

迭代法 (。。。。。)

class Solution {public:TreeNode* sortedArrayToBST(vector<int>& nums) {if (nums.size() == 0) return nullptr;TreeNode* root = new TreeNode(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]; // 将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;}
};

将有序数组转为二叉搜索树相关推荐

  1. 将字符串转换为数组_LeetCode 树 108.将有序数组转换为二叉搜索树

    7(108) 将有序数组转换为二叉搜索树 描述 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 ...

  2. 数据结构与算法--力扣108题将有序数组转换为二叉搜索树

    力扣108提将有序数组转换为二叉搜索树 近一年都比较关注算法相关的知识,也刷了不少题,之前的文章中大多也是算法相关的文章,但是感觉每次遇到树相关的题型都不能应对自如,因此还是有必要在相关知识上下功夫, ...

  3. [leetcode-108,109] 将有序数组转换为二叉搜索树

    109. 有序链表转换二叉搜索树 Given a singly linked list where elements are sorted in ascending order, convert it ...

  4. 20200703:将有序数组转换为二叉搜索树(leetcode108)

    将有序数组转换为二叉搜索树 题目 思路与算法 代码实现 复杂度分析 题目 将有序数组转换为二叉搜索树 思路与算法 乍一看很简单,实际也很简单,今天的动态规划没做出来,就刷每日一题好了.保证平衡的最简单 ...

  5. 20190917:(leetcode习题)将有序数组转换为二叉搜索树

    将有序数组转换为二叉搜索树 题目 大致思路 代码实现 题目 大致思路 将有序数组转换为二叉平衡树,即左边的数和右边数的差值不超过1,那么root节点应该为正中间的数,然后左边的剩余的中间为root.l ...

  6. laravel数组转换为字符串_LeetCode刷题实战108:将有序数组转换为二叉搜索树

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  7. Suzy找到实习了吗 Day23 | 二叉树最后一节!669. 修剪二叉搜索树,108. 将有序数组转换为二叉搜索树,538. 把二叉搜索树转换为累加树

    669. 修剪二叉搜索树 题目 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high.通过修剪二叉搜索树,使得所有节点的值在[low, high]中.修剪树 不应该 改变保 ...

  8. LeetCode(Python)—— 将有序数组转换为二叉搜索树(简单)

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

  9. leetcode刷题记录--数据结构;深度优先搜索算法;二叉树;平衡树;1020. 飞地的数量;1669. 合并两个链表;108. 将有序数组转换为二叉搜索树

    1020. 飞地的数量 难度中等131 给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格.1 表示一个陆地单元格. 一次 移动 是指从一个陆地单元格走到另一个相邻(上 ...

最新文章

  1. 解决ie6、7 margin-bottom 失效问题
  2. 四种可变交流swap方法
  3. Guacamole-RDP没有声音解决办法
  4. [css] 请说说*{box-sizing: border-box;}的作用及好处有哪些?
  5. wps如何自己制作流程图_WPS小技巧——如何制作炫酷的个性电子简历
  6. Spring Boot 2.0与Java 9
  7. 032——VUE中表单控件处理之复选框的处理
  8. Android 系统(254)---Android libphonenumber Demo 手机号码归属地
  9. Octopress使用中经验总结
  10. Lock锁的简单使用
  11. shell foreach 拼接字符串_FIND_IN_SET 及IN 处理逗号间隔的字符串参数
  12. MySQL 时间戳(timestamp类型)和时间(datetime类型)的获取/相互转换/格式化
  13. 【Meachine Learning】lecture1 --吴恩达
  14. ORACLE系统表和视图
  15. QT-700多种实用好看的图标,直接拿来用
  16. matlab中四元数与三维向量的乘,四元数与三维向量相乘运算法则
  17. python访问陌生人qq空间_自己的QQ空间怎么不让陌生人进入—设置访问权限
  18. php choose handler,Guzzle 源码分析
  19. matlab画空间直角坐标系,matlab画直角坐标系
  20. Android程序员需掌握的JVM知识

热门文章

  1. 关于js优化和css优化
  2. CONTEST199 [有奖]洛谷8月月赛题解
  3. 来首都初次就医的感受
  4. StringBuffer 案例
  5. win7 64+python2.7.12安装numpy+scipy+matplotlib+scikit-learn
  6. 网站开发之DIV+CSS简单布局网站入门篇(五)
  7. [LeetCode] Valid Anagram - 字符串排序比较系列
  8. 王牌之作 特斯拉国产Model Y明年初下线
  9. Pycharm2018最新激活方式
  10. Linux(三) 运行级别