前言:

二叉树刷题是有固定思维的,请移步

README】二叉树刷题框架

文章目录

  • 前言:
  • 从前序和中序遍历构建二叉树
    • 思路
    • 代码
    • 注意
  • 从中序和后序遍历构建二叉树
    • 思路
    • 代码

从前序和中序遍历构建二叉树

题目

点击跳转:LeetCode

思路

这道题体现的就是分治的思想,我们知道前序遍历啊可以确定一个子树的根节点,而中序遍历可以根据根节点将一颗子树再次分为左右子树,所以只需分解完成一次,后面的过程就是递归过程

如下,首先根据前序确定这棵树的根节点为A,然后根据中序遍历确定A的左右子树在中序中的范围

下一步又分别确定了左右子树的根节点为B和C

剩下的就是递归过程

代码

class Solution {public:TreeNode* _buildTree(vector<int>& preorder,vector<int>& inorder,int& previ,int inbegin,int inend){if(inbegin>inend)//中序区间不存在,也就是该结点不存在左子树return nullptr;int rooti=inbegin;//用rooti保存中序遍历中root的位置while(rooti<=inend)//寻找{if(inorder[rooti]==preorder[previ])break;elserooti++;}TreeNode* root=new TreeNode(preorder[previ]);//依此时前序遍历的第一个值创建一个结点++previ;//划分区间,剩余的过程就是递归//即[inbegin,rooti-1]root[rooti+1,inend]root->left=_buildTree(preorder,inorder,previ,inbegin,rooti-1);root->right=_buildTree(preorder,inorder,previ,rooti+1,inend);return root;}TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {int previ=0;return _buildTree(preorder,inorder,previ,0,inorder.size()-1);}
};

注意

上述代码中有一个很重要的判断

if(inbegin>inend)//中序区间不存在,也就是该结点不存在左子树return nullptr;

这个判断是为了防止中序遍历区间不存在的情况,如下,下面的树中结点A没有左子树,所以就会导致inbegin > inend

从中序和后序遍历构建二叉树

题目

点击跳转:LeetCode

思路

和上一题思路一致,只不过需要注意的是,一定要先构建右子树然后构建左子树

代码

class Solution {public:TreeNode* _buildTree(vector<int>& inorder,vector<int>& postorder,int& posti,int inbegin,int inend){if(inbegin>inend)//区间不存在return nullptr;int rooti=inbegin;while(rooti<=inend){if(inorder[rooti]==postorder[posti])break;elserooti++;}TreeNode* root=new TreeNode(postorder[posti]);--posti;root->right=_buildTree(inorder,postorder,posti,rooti+1,inend);root->left=_buildTree(inorder,postorder,posti,inbegin,rooti-1);return root;}TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {int posti=postorder.size()-1;return _buildTree(inorder,postorder,posti,0,inorder.size()-1);}
};

二叉树经典题之从前序和中序遍历构建二叉树相关推荐

  1. 【LeetCode】——根据前序和中序遍历构建二叉树

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

  2. [Leetcode][第889题][JAVA][根据前序和后序遍历构造二叉树][分治][递归]

    [问题描述][中等] [解答思路] copyOfRange class Solution {public TreeNode constructFromPrePost(int[] pre, int[] ...

  3. 通过前序遍历和中序遍历构建二叉树 python实现

    前言 通过前序遍历和中序遍历构建二叉树的原理,主要是找前序遍历根节点在中序遍历中的位置,然后将二叉树而成左子树和右子树,然后依次进行这样的操作,思路还是比较简单的 代码 class Node:def ...

  4. 数据结构---前序和中序遍历的二叉树序列还原二叉树

    数据结构-前序和中序遍历的二叉树序列还原二叉树 代码: #include<stdio.h> #include<stdlib.h> typedef struct bstTree ...

  5. LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal 由前序和中序遍历建立二叉树 C++...

    LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal 由前序和中序遍历建立二叉树 C++ Given preo ...

  6. 根据二叉树先序遍历和中序遍历构建二叉树

    前方有一个人在等着你,你只管勇敢的向前走 采用递归分治的思想,将一个大问题划分成子问题, 对于本题,根据二叉树先序遍历和中序遍历构建二叉树,思路: 我们可以求得根节点左子树的先序和中序序列,以及右子树 ...

  7. 【C++/数据结构】先序遍历+中序遍历构建二叉树

    #include<vector> using namespace std; struct TreeNode {     int val;     TreeNode* left;     T ...

  8. 通过层序遍历和中序遍历构建二叉树

    通过层序遍历和中序遍历构建二叉树的过程与通过中序遍历和先序遍历构建二叉树的过程很相似. 先序遍历和中序遍历是通过先序遍历的首个元素确定根节点,再根据这个元素在中序遍历中出现的位置分为左子树和右子树,然 ...

  9. leetcode题解:Construct Binary Tree from Preorder and Inorder Traversal (根据前序和中序遍历构造二叉树)...

    题目: Given preorder and inorder traversal of a tree, construct the binary tree. Note: You may assume ...

最新文章

  1. 在线试玩,在体感游戏中打败泰森,这位小哥破解了任天堂「拳无虚发」
  2. abap视图字段限制_MM03物料主数据视图中某些视图或者某些字段的控制方法 | 学步园...
  3. 《博客园精华集》Sharepoint+MOSS分册
  4. C# XML反序列化与序列化举例:XmlSerializer(转)
  5. 苹果一键越狱工具_最新苹果越狱工具现世,可越狱所有iOS版本!
  6. 阿里巴巴HRSSC:用宜搭实现业务管理模式创新
  7. set java底层实现_Java:List,Map,Set底层实现
  8. 使用live555制作rtsp客户端,捕获h264等解码
  9. 系统学习数字图像处理之形态学分析补充(灰度级处理)
  10. HTML5 Geolocation(地理定位)用于定位用户的位置。
  11. CI520只有SPI通讯接口,支持读写A卡,PIN对PIN直接替换CV520软硬件兼容
  12. 如何做IT项目PoC测试
  13. 卡莱特led显示屏调试教程_如何使用卡莱特软件点亮LED电子显示屏
  14. 高精密应变片0.01g信号采集方案分享
  15. QML_ToolSeparator、ToolTip和Tumbler
  16. DevOps之基础设施
  17. JCL中utilities的使用
  18. python爬虫案例——东方财富股票数据采集
  19. IA-PEG2k-MAL,Iodoacetyl-PEG2k-MAL避光避湿保存,取用时注意干燥
  20. HTML5游戏引擎(十五)-时间控制——Timer计时器 Ticker心跳-startTick-stopTick 帧事件-ENTER_FRAME

热门文章

  1. HTML5设备API 大批美女等你来摇一摇
  2. linux多线程冗余,Linux  下的路径冗余
  3. java 共享软件 保护_【Java并发.3】对象的共享
  4. java白盒测试面试题_面试之JAVA基础Junit了解
  5. 吴恩达机器学习笔记一
  6. Nature | 我的研究对后人毫无用途:21%的学术论文自发布后从未被引用
  7. 3-8 译码器设计实验--VHDL
  8. 并发200_一种单机支持 JavaWeb 容器万级并发的设想
  9. 简单英文题 37 Prime(python)
  10. 1.9 编程基础之顺序查找 09 直方图 9分 python