转载自:http://blog.csdn.net/sbitswc/article/details/26433051

Given preorder and inorder traversal of a tree, construct the binary tree.

Note:
You may assume that duplicates do not exist in the tree.

There is an example.
        _______7______/              \__10__          ___2/      \        /4       3      _8\    /1  11
The preorder and inorder traversals for the binary tree above is:
preorder = {7,10,4,3,1,2,8,11}
inorder = {4,10,3,1,7,11,8,2}

The first node in preorder alwasy the root of the tree. We can break the tree like:
1st round:
preorder:  {7}, {10,4,3,1}, {2,8,11}
inorder:     {4,10,3,1}, {7}, {11, 8,2}

        _______7______/              \{4,10,3,1}       {11,8,2}
Since we alreay find that {7} will be the root, and in "inorder" sert, all the data in the left of {7} will construct the left sub-tree. And the right part will construct a right sub-tree. We can the left and right part agin based on the preorder.

2nd round
left part                                                                            right part
preorder: {10}, {4}, {3,1}                                              {2}, {8,11}
inorder:  {4}, {10}, {3,1}                                                {11,8}, {2}

        _______7______/              \__10__          ___2/      \        /4      {3,1}   {11,8}
see that, {10} will be the root of left-sub-tree and {2} will be the root of right-sub-tree.

Same way to split {3,1} and {11,8}, yo will get the complete tree now.

        _______7______/              \__10__          ___2/      \        /4       3      _8\    /1  11
So, simulate this process from bottom to top with recursion as following code.

c++

[cpp] view plain copy
  1. TreeNode *BuildTreePI(
  2. vector<int> &preorder,
  3. vector<int> &inorder,
  4. int p_s, int p_e,
  5. int i_s, int i_e){
  6. if(p_s > p_e) return NULL;
  7. int pivot = preorder[p_s];
  8. int i = i_s;
  9. for(;i<i_e;i++){
  10. if(inorder[i] == pivot)
  11. break;
  12. }
  13. int length1 = i-i_s-1;
  14. int length2 = i_e-i-1;
  15. TreeNode* node = new TreeNode(pivot);
  16. node->left = BuildTreePI(preorder,inorder,p_s+1,length1+p_s+1,i_s, i-1);
  17. node->right = BuildTreePI(preorder, inorder, p_e-length2, p_e, i+1, i_e);
  18. return node;
  19. }
  20. TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
  21. return BuildTreePI(preorder,inorder,0,preorder.size()-1,0,inorder.size()-1);
  22. }

java

[java] view plain copy
  1. public TreeNode buildTree(int[] preorder, int[] inorder) {
  2. return buildPI(preorder, inorder, 0, preorder.length-1, 0, inorder.length-1);
  3. }
  4. public TreeNode buildPI(int[] preorder, int[] inorder, int p_s, int p_e, int i_s, int i_e){
  5. if(p_s>p_e)
  6. return null;
  7. int pivot = preorder[p_s];
  8. int i = i_s;
  9. for(;i<i_e;i++){
  10. if(inorder[i]==pivot)
  11. break;
  12. }
  13. TreeNode node = new TreeNode(pivot);
  14. int lenLeft = i-i_s;
  15. node.left = buildPI(preorder, inorder, p_s+1, p_s+lenLeft, i_s, i-1);
  16. node.right = buildPI(preorder, inorder, p_s+lenLeft+1, p_e, i+1, i_e);
  17. return node;
  18. }

按照前序遍历和中序遍历构建二叉树相关推荐

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

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

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

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

  3. 根据二叉树前序遍历和中序遍历重建二叉树

    剑指 Offer 07. 重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如,给出 前序遍历 preorder = [3, ...

  4. 根据前序遍历和[中序遍历]

    根据前序遍历和[中序遍历] 1. 递归法: 先序遍历:根节点→左子树→右子树. 中序遍历:左子树→根节点→右子树. 后续遍历:左子树→右子树→根节点. 根据前序遍历和中序遍历建立二叉树,根据以上性质可 ...

  5. 根据前序遍历和中序遍历创建二叉树

    根据前序遍历和中序遍历创建二叉树 题目要求如下: 给定某一个二叉树的前序遍历和中序遍历,要求据此创建一颗符合这样遍历顺序的二叉树. 前序遍历和中序遍历的概念以及特性: 前序遍历:先遍历节点本身,再遍历 ...

  6. python实现二叉树的重建1 之由前序遍历和中序遍历重建

    前言 此题是关于树的面试题目的常见题型,题目的含义很清晰,这个就不用多说了 解法 关于这道题的解法有很多不同的样式,通用的解法是这样的: 假如现在我们有如下两个遍历的情况 preorder: [1, ...

  7. 根据二叉树的前序遍历和中序遍历重建二叉树

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  8. python实现二叉树遍历(前序遍历、中序遍历、后序遍历)

    python实现二叉树遍历(前序遍历.中序遍历.后序遍历) 在计算机科学中,二叉树是一种树数据结构,其中每个节点最多有两个子节点,称为左子节点和右子节点.使用集合理论概念的递归定义是(非空)二叉树是元 ...

  9. 前序遍历与中序遍历确定后序遍历

    1003. 二叉树后序遍历     Total: 137 Accepted: 80                 Time Limit: 3sec    Memory Limit:256MB Des ...

  10. 二叉树的前序遍历,中序遍历,后序遍历学习 (原)

    经验: 不要死记各个遍历节点的位置,将一个复杂的二叉树当作一个个小的二叉树学习前序遍历,中序遍历,后序遍历会更容易理解 转载于:https://www.cnblogs.com/gyrgyr/p/962 ...

最新文章

  1. APUE 学习笔记(一) Unix基础知识
  2. Docker之几种storage-driver比较
  3. BZOJ 3043 IncDec Sequence:反向差分
  4. 一键清除 打印机内无法清除作业
  5. 力扣1009.十进制整数的反码
  6. rm ,rm -rf , rm -f,rm -r 以及rm 命令的其他参数命令
  7. 使用异或解题 —— 序列中仅出现一次的两个数
  8. bzoj 3381: [Usaco2004 Open]Cave Cows 2 洞穴里的牛之二(RMQ)
  9. CELL_TYPE_STRING cannot be resovled or is not a field
  10. icesat2:strong beam and weak beam
  11. Linux inittab和oracle lsntctl 启动的问题解决办法
  12. 向量叉积和点积混合运算_matlab中的向量的数量积和向量积
  13. 列举1000以内的水仙花数,并求出水仙花数的个数
  14. android 地址选择下载,选择走开下载-选择走开(吃饭位置选择)下载v1.0.4 安卓版-西西软件下载...
  15. php curl添加授权Authorization 验证头
  16. MATLAB批量修改图片名称
  17. HUE下载提示The number of resulting rows was too big to be downloaded
  18. 国内低代码开发平台发展现状
  19. matlab数理基础之 牛顿-莱布尼兹公式具体应用有哪些,用matlab如何实现
  20. 正则表达式的正数校验

热门文章

  1. java servlet https_javaweb项目对https的配置01
  2. 最诡异数学悖论:1+1=1
  3. 为什么睡觉时身体突然抖一下?答案吓到我了!
  4. 史上最硬核的数学老师!搞发明、造大炮,让战斗民族直叫爸爸,看完我跪了......
  5. 一文读懂 HMM 模型和 Viterbi 算法
  6. 哪种HTML列表会自动编号,HTML列表的种类
  7. gamaredon_Gamaredon组织某样本分析
  8. bytecode java_Java 字节码解读
  9. 程序显示文本框_【教程】TestComplete测试桌面应用程序教程(二)
  10. 下列选项中 采用边界值平滑_数据挖掘期末考题(答案).doc