终于算是熬过期末以后想起来了学学习了哈哈哈哈。

今天看看二叉树的构造,以下内容为自我学习总结,主要目的为学习笔记,兼职传播小想法。内容为学习labuladong的学习笔记。以下为链接,感谢大佬的学习讲解!有想看这几题的小伙伴建议直接链接左转!

笔记:东哥带你刷二叉树(构造篇) :: labuladong的算法小抄

好,那么正题开始。

Leetcode 654 最大二叉树

654题:最大二叉树

秉持着二叉树的题能多传参就不少传参的想法,肯定想是要先定义一个多的参数的函数。

然后现在这些题总共的一个最重要的共同点都是利用一串vector<int>生成一个二叉树。那么这个vector肯定是根据不同的题目有着不同的排列规则。就比如这个题,我们这一看,肯定是递归了。

对于以下vector的关系图如下:

6最大,为根节点,此时6所在的index==3。所以从0和2为递归的root->left的需要的参数,4和5为递归的root->right所需要的参数。再如此这般在传参进去的left到right之间找最大值,以此最大值生成一个新节点,再利用剩余的数字递归生成左右子树。上代码

class Solution {
public:TreeNode* constructMaximumBinaryTree(vector<int>& nums) {return developTree(nums,0,nums.size()-1);}TreeNode* developTree(vector<int>& nums, int left, int right){if(right<left)  return nullptr;int max = -1,maxi = left;for(int i = left; i<=right;i++){if(nums[i]>max){max = nums[i];maxi = i;}    }TreeNode* root = new TreeNode(max);root->left = developTree(nums,left,maxi-1);root->right = developTree(nums, maxi+1, right);return root;}
};

所以此处的思想为利用一些 left&right indexes 去辅助查找和生成左右子树,此思想也会被利用在下面几个题中。

Leetcode 105 用前序和中序结果生成二叉树 & Leetcode 106 用后序和中序结果生成二叉树

105题:用前序和中序结果生成二叉树

106题:用中序和后续结果生成二叉树

这两个题,我只能说是一模一样。

小记录一下,对于一个这样的二叉树,前中后序的结果分别为

preOrder = [1,2,4,8,5,3,6,9,10,7]

inOrder = [4,8,2,5,1,9,10,6,3,7]

postOrder = [8,4,5,2,9,10,6,7,3,1]

所以不用多说,对于105题,有前序和中序结果,那么我们只需要在每次知道preStart, preEnd, inStart, inEnd这四个值,就知道蓝色的root->left是从第几个开始到第几个结束,橙色的root->right是从第几个开始到第几个结束。

对于106题,我们有如下图的结果

105题就是利用前序遍历的第一位是root , 然后找出中序遍历的结果在哪,这样就能算出做子树的大小和右子树的大小。106题同理。

注意:这里有一个学到的妙用就是利用hash_map记录一下inorder的值和index的对应关系,就不用再每次都去便利一遍看preOrder的第一位在inOrder的第几位了。(因为每次preOrder的第一位和postOrder的最后一位都是root的值,然后利用这个唯一值我们就能得root在这个inOrder的位置,就能算出左子树的大小和右子树的大小。hash_map会加快便利找到inOrder的速度。)

上105题代码:

class Solution {
public:unordered_map<int,int>  mp;TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {for(int i = 0; i<preorder.size();i++){mp.insert(make_pair(inorder[i],i));}return develop(preorder, 0, preorder.size()-1 , inorder, 0, preorder.size()-1);}TreeNode* develop(vector<int>& preorder, int preStart, int preEnd, vector<int>& inorder, int inStart, int inEnd){if(preStart>preEnd)    return nullptr;int index = mp.at(preorder[preStart]);int LeftLength = index - inStart;TreeNode* root = new TreeNode(preorder[preStart]);root->left = develop(preorder,preStart+1,preStart+LeftLength,inorder,inStart,index-1);root->right = develop(preorder,preStart+1+LeftLength,preEnd,inorder,index+1,inEnd);return root;}
};

上106题代码:

class Solution {
public:unordered_map<int ,int> mp;TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {for(int i = 0; i < inorder.size();i++){mp.insert(make_pair(inorder[i],i));}return develop(inorder,0,inorder.size()-1,postorder,0,inorder.size()-1);}TreeNode* develop(vector<int>& inorder, int inStart, int inEnd,vector<int>& postorder, int postStart, int postEnd){if(postStart>postEnd || inStart>inEnd)  return nullptr;int index = mp.at(postorder[postEnd]);int leftLength = index-inStart;TreeNode* root = new TreeNode(postorder[postEnd]);root->left = develop(inorder,inStart,index-1,postorder,postStart,postStart+leftLength-1);root->right = develop(inorder,index+1,inEnd,postorder,postStart+leftLength,postEnd-1);return root;}
};

可以看到其实就是利用root在inOrder的位置计算左子树的大小,然后再向下递归的。

Leetcode 889 用前序和后序结果生成二叉树 

889题:用前序和后续结果生成二叉树

这题挺没意思的,因为只有前序和后序的结果没办法还原一个唯一的二叉树,所以这题可以做出五花八门的数然后跑测试都能过,没啥劲,上代码吧:

class Solution {
public:unordered_map<int,int>  mp;TreeNode* constructFromPrePost(vector<int>& preorder, vector<int>& postorder) {for(int i = 0; i<postorder.size();i++){mp.insert(make_pair(postorder[i],i));}return develop(preorder,0,postorder.size()-1,postorder,0,postorder.size()-1);}TreeNode* develop(vector<int>& preorder,int preStart, int preEnd, vector<int>& postorder, int postStart, int postEnd){if(preEnd<preStart || postEnd<postStart)    return nullptr;//这句话就是想不到,为啥啊我焯if (preStart == preEnd) {return new TreeNode(preorder[preStart]);}//int postLeftIndex = mp.at(preorder[preStart+1]);int leftLength = postLeftIndex - postStart +1;TreeNode* root = new TreeNode(preorder[preStart]);root->left = develop(preorder,preStart+1,preStart+leftLength,postorder,postStart,postLeftIndex);root->right = develop(preorder,preStart+leftLength+1,preEnd,postorder,postLeftIndex+1,postEnd-1);return root;}};

自我总结:Leetcode 654, 105, 106, 889相关推荐

  1. 贴片电容102 103 104 105 106分别是多少?

    贴片电容102 103 104 105 106分别是多少,贴片电容型号有很多种换算方法,但是我们只需要知道一种就好了,下面我们来看看贴片电容102 103 104 105 106容值大小怎么表示. 贴 ...

  2. LeetCode 101~105

    前言 本文隶属于专栏<LeetCode 刷题汇总>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构请见LeetCode 刷题汇总 Github ...

  3. LeetCode 654. 最大二叉树(递归)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个不含重复元素的整数数组.一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素. 左子树是通过数组中最大值左边部分构造出的最大二叉树 ...

  4. 【LeetCode】105#从前序与中序遍历序列构造二叉树

    题目描述 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9 ...

  5. leetcode 654. 构造最大二叉树 思考分析

    题目 给定一个不含重复元素的整数数组.一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素. 左子树是通过数组中最大值左边部分构造出的最大二叉树. 右子树是通过数组中最大值右边部分构造 ...

  6. leetcode —— 654. 最大二叉树

    给定一个不含重复元素的整数数组.一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素. 左子树是通过数组中最大值左边部分构造出的最大二叉树. 右子树是通过数组中最大值右边部分构造出的最 ...

  7. LeetCode 654 最大二叉树

    题目链接:力扣s 思路: 递归 递归函数声明: TreeNode*  constructMaximumBinaryTree(vector<int>& nums) 递归出口:  (1 ...

  8. LeetCode 654. Maximum Binary Tree最大二叉树 (C++)

    题目: Given an integer array with no duplicates. A maximum tree building on this array is defined as f ...

  9. 【必拿下系列】106. 从中序与后序遍历序列构造二叉树105从前序与中序遍历序列构造二叉树

    两题各自的链接放这里了: 链接: 106 链接: 105 106.从中序与后序遍历序列构造二叉树 如果你是不知道理论的,那就得仔细分析了, 举个例子: 输入:inorder = [9,3,15,20, ...

最新文章

  1. JAVA SE学习day_12:集合的排序、队列、栈结构
  2. div 布局_CSS布局:三栏布局
  3. 一些网站github等无法连接服务器的解决办法
  4. 论文浅尝 | 基于深度强化学习的远程监督数据集的降噪
  5. C/C++ -- Gui编程 -- Qt库的使用 -- 使用.ui文件
  6. day1:作业 编写登录接口并画出相应的流程图
  7. Android反射修改view,Android 修改viewpage滑动速度的实现代码
  8. Ubuntu18.04误删分区表,无法挂载U盘解决
  9. 成功转型机器学习,多年的经验分享
  10. 【转载】Java 对象之死
  11. RHEL6基础二十四之RHEL软件包管理③源码安装
  12. 如何下载安装fireBug
  13. 解决 googel 无法直接跳转网页打开搜索结果
  14. 系列学习 Gateway 之第 5 篇 —— 搭建高可用网关(完结)
  15. QT在界面背景图设置后运行显示黑屏
  16. php去除换行(回车换行)的三种方法
  17. Hadoop完全分布式搭建(在三台虚拟机中实现)
  18. 埃森哲:数字化转型成功的企业,他们都做到了这5点
  19. 基于EtherNet/IP实现欧姆龙NX系列PLC通信
  20. 查看主机的物理cpu个数、逻辑cpu个数、单个cpu的核数、是否开启超线程

热门文章

  1. maya python手册_Maya中Python普及教程.doc
  2. PhotoshopCC2018教程73课时-1.57G
  3. sin 与 cos 的用法
  4. 邮件的发送方式有哪几种?
  5. 思特威车规级图像传感器再添新芯SC120AT,集成ISP二合一功能闪亮登场
  6. jsbox 导入_jsbox
  7. 怎么将png图片转换成jpg
  8. 双屏折叠手机哪家强?华为,三星,柔宇..大比拼
  9. mysql 将xml插入数据库_从xml文档中读取数据并插入mysql数据库中
  10. Python版本VTK官方文档教程学习(五)