最难的地方在于对序列的下标计算,比如给定一个序列,开始下标是i,那么下标i+1就是开始元素的后一个元素,注意到,1还是当前元素组成的列表的元素个数。即i + size,是包含i元素在内的size个数组的最后一个元素的后面一个位置的下标边界。

所以对中序序列的划分,左子树是[inL, inL + leftTreeSize),右子树是[inL + leftTreeSize + 1, inR),其中inL + leftTreeSize恰好是根元素在中序序列上的下标,右子树的最右边的下一个元素就是inR,这里是用老外喜欢的区间定义,左闭右开,即左边包含右边不包含。

对于后序遍历序列,要根据切分中序序列得到的左子树的大小来定界。

理解了i+1,就知道,pL+leftTreeSize恰好是左子树的右边界(不包含),也恰好是右子树的左边起始,右子树的右边结束是pR-1,注意,pR是整个序列的右边界,且不包含,pR-1恰好是根元素下标,所以是右子树的右边界(不包含)。

理清楚这样的下标关系,问题就很直观了,需要设置一个helper函数,来跟踪下标,其他的就没有什么特别细节的地方了。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {public:// 根据中序和后序遍历序列构建二叉树// 可以唯一构建一棵二叉树TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {return  helper(inorder, 0, inorder.size(), postorder, 0, postorder.size()); // 左闭右   }// i,j是中序遍历序列的[i,j),j可以看成是中序序列的元素个数// 传递的是引用变量,所以需要用下标跟踪TreeNode* helper(vector<int>& inorder, int inL, int inR, vector<int>& postorder, int pL, int pR) {if(inL >= inR || pL >= pR) {return NULL;}int root = postorder[pR-1];TreeNode* rootNode = new TreeNode(root);int k; // 根元素在中序序列的位置for (int i = inL;i < inR; i++) {if (inorder[i] == root) {k = i;break;}        }int leftTreeSize = k - inL; // 不含k下标// 划分左右子树rootNode->left = helper(inorder, inL, inL + leftTreeSize, postorder, pL, pL + leftTreeSize);rootNode->right = helper(inorder, inL + leftTreeSize + 1, inR, postorder, pL + leftTreeSize, pR - 1);return rootNode;}
};

END.

Leetcode106 由中序序列和后序序列构建二叉树相关推荐

  1. 已知一棵二叉树的中序序列和后序序列,写一个建立该二叉树的二叉链表存储结构的算法...

    已知一棵二叉树的中序序列和后序序列,写一个建立该二叉树的二叉链表存储结构的算法 #define N 10 //二叉树节点的个数 char postorderstr[]={};//后序序列 char i ...

  2. PAT甲级1020 Tree Traversals:[C++题解]树的遍历、由中序序列和后序序列递归建树

    文章目录 题目分析 题目链接 题目分析 题意重述:给定一棵二叉树的后序遍历序列和中序遍历序列,让求层次遍历的序列. 分析: 后序遍历:先 左子树.右子树 ,最后再遍历根结点. 中序遍历:先左子树,再根 ...

  3. 二叉树(前序遍历序列、中序遍历序列、后序遍历序列、层次遍历序列、深度、叶子数)

    Description 已知二叉树的一个按前序遍历输入的字符序列,如abc,de,g,f, (其中,表示空结点).请建立二叉树,并输出建立二叉树的前序遍历序列.中序遍历序列.后序遍历序列.层次遍历序列 ...

  4. 7-10 先序序列创建二叉树,输出先序序列、中序序列、后序序列并输出叶子结点数 (10 分)

    7-10 先序序列创建二叉树,输出先序序列.中序序列.后序序列并输出叶子结点数 (10 分) 对于给定的二叉树,输出其先序序列.中序序列.后序序列并输出叶子结点数. 输入格式: 二叉树的先序遍历序列. ...

  5. 由前序序列与中序序列实现后序遍历

    二叉树是一种特殊的树,二叉树只有两个分支,分别是该节点的左儿子和右儿子. 前序遍历:就是先遍历根节点,然后再访问左子树与右子树.遍历子树的时候同样也是先遍历根节点然后在遍历他的左子树与右子树. 中序遍 ...

  6. 天梯选拔:先序序列创建二叉树,输出先序序列、中序序列、后序序列并输出叶子结点数

    思路分析: 这道题考察二叉树的建立以及二叉树的前序遍历.中序遍历和后序遍历.首先按照先序建立二叉树.在这期间需要先建立一个结构体,包括当前节点的值,以及它的左儿子和右儿子.注意这里不能直接存左儿子和右 ...

  7. 每天一道LeetCode-----根据中序遍历和后序遍历重构二叉树

    Construct Binary Tree from Inorder and Postorder Traversal 原题链接Construct Binary Tree from Inorder an ...

  8. java根据前序和中序建树_Java实现根据前序遍历构建二叉树(前序遍历、中序遍历、后序遍历)...

    Java实现根据前序遍历构建二叉树(前序遍历.中序遍历.后序遍历),Java关于ACM的代码真的好少,想参考如何用java实现二叉树googl 前言 Java关于ACM的代码真的好少,想参考如何用ja ...

  9. 二叉树的前序遍历,中序遍历,后序遍历

    这三也是经典的二叉树的三种方法 二叉树的前序遍历 递归实现 public class Main4 {static ArrayList<TreeNode> list = new ArrayL ...

  10. 先序序列和后序序列并不能唯一确定二叉树

    数据结构的基础知识中重要的一点就是能否根据两种不同遍历序列的组合(有三种:先序+中序,先序+后序,中序+后序),唯一的确定一棵二叉树.然后就是根据二叉树的不同遍历序列(先序.中序.后序),重构二叉树. ...

最新文章

  1. jwt获取token_SpringBoot2 高级案例(09): 整合 JWT 框架,解决Token跨域验证问题
  2. Java新手问题集锦
  3. php7 nts,php7.0.24-nts配置步骤
  4. pip设置下载源为国内镜象源永久设置方法-windows版本
  5. linux mount 默认读写,Linux mount 修改文件系统的读写属性
  6. linux 无法mkdir文件夹,linux 不能mkdir了
  7. html app效果图,app端效果图.html
  8. 【语义分割】深度学习中常见概念回顾(全大白话解释,一读就能懂!)
  9. 严蔚敏数据结构习题第十章
  10. 64位电脑c语言程序下载,vc2010 x64位
  11. 搭建一个网站的价格以及步骤全面解读
  12. android 按键流程及映射
  13. 数据管理:业务数据清洗,落地实现方案
  14. Composition API使用记录
  15. android bks证书生成方式
  16. 非对称加密RSA文本和Excel文件加密练习
  17. 面试最常问的设计模式
  18. css画横线箭头_css 画带边框的箭头的问题
  19. java中方法的细分(普通方法,静态方法,构造方法)
  20. Inventor(C#)开发学习小结——入门篇

热门文章

  1. 酒吧声场测试软件,做到以下几点 酒吧音响效果出奇的好
  2. 5图片展示_拼多多搜索【智能创意】推广5大功能升级!
  3. k8s 命令 重启_k8s基本命令
  4. python画数学函数_Python 绘制你想要的数学函数图形 !
  5. python坐标轴拉伸_python-Matplotlib垂直拉伸histogram2d
  6. 计算机组成原理中计算机主要包括哪几部分,计算机组成原理本科生期末试卷(五)部分答案详解...
  7. python代码编写_高质量Python代码编写的5个优化技巧
  8. r语言min-max归一化_如何在R中使用min()和max()
  9. jni ndk_带有NDK的Android JNI应用程序
  10. spring的bean注释_Spring @Bean注释