题目描述(剑指offer)

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
  1 #include <iostream>
  2 #include <vector>
  3 using namespace std;
  4
  5  // Definition for binary tree
  6 struct TreeNode {
  7       int val;
  8       TreeNode *left;
  9       TreeNode *right;
 10       TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 11
 12 };
 13 /* 先序遍历第一个位置肯定是根节点node,
 14 中序遍历的根节点位置在中间p,在p左边的肯定是node的左子树的中序数组,p右边的肯定是node的右子树的中序数组
 15 另一方面,先序遍历的第二个位置到p,也是node左子树的先序子数组,剩下p右边的就是node的右子树的先序子数组
 16 把四个数组找出来,分左右递归调用即可
 17  */
 18
 19 class Solution
 20 {
 21 public:
 22     struct TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> vin)
 23     {
 24         int in_size = vin.size();//获取序列的长度
 25         if (in_size == 0)
 26             return NULL;
 27
 28         //分别存储先序序列的左子树,先序序列的右子树,中序序列的左子树,中序序列的右子树
 29         vector<int>pre_left, pre_right, in_left, in_right;
 30
 31         int val = pre[0];//先序遍历第一个位置是根节点node,取其值
 32         //新建一个树结点,并传入结点值
 33         TreeNode* node = new TreeNode(val);
 34
 35         //p用于储存中序序列中根节点的位置
 36         int p = 0;
 37         for (p; p < in_size; ++p)
 38         {
 39             if (vin[p] == val)
 40                 break;//找到即跳出for循环
 41         }
 42
 43         for (int i = 0; i < in_size; ++i)
 44         {
 45             if (i < p)
 46             {
 47                 //建立中序序列的左子树和前序序列的左子树
 48                 in_left.push_back(vin[i]);
 49                 pre_left.push_back(pre[i + 1]);//前序第一个为根节点,+1从下一个开始记录
 50             }
 51             else if(i>p)
 52             {
 53                 //建立中序序列的右子树和前序序列的右子树
 54                 in_right.push_back(vin[i]);
 55                 pre_right.push_back(pre[i]);
 56             }
 57         }
 58
 59         //取出前序和中序遍历根节点左边和右边的子树
 60         //递归,再对其进行上述所有步骤,即再区分子树的左、右子子数,直到叶节点
 61         node->left = reConstructBinaryTree(pre_left, in_left);
 62         node->right = reConstructBinaryTree(pre_right, in_right);
 63
 64         return node;
 65     }
 66
 67 };
 68
 69 //test=====后序递归遍历二叉树
 70 void Posorder(TreeNode* &T)
 71 {
 72     if (T)//当结点不为空的时候执行
 73     {
 74         //左右中
 75         Posorder(T->left);
 76         Posorder(T->right);
 77         cout << T->val;
 78
 79     }
 80     else
 81     {
 82         //cout << " ";
 83         T = NULL;
 84     }
 85 }
 86
 87 int main()
 88 {
 89     vector<int>pre{1,2,4,7,3,5,6,8};
 90     vector<int>vin{4,7,2,1,5,3,8,6};
 91
 92     Solution T;
 93     TreeNode* node=T.reConstructBinaryTree(pre, vin);
 94
 95     //测试---输出后续遍历
 96     cout << "后续遍历为:" << endl;
 97     Posorder(node);
 98     cout << endl;
 99
100     system("pause");
101 }

测试结果:

转载于:https://www.cnblogs.com/zhuifengshaonian/p/10102931.html

二叉树重建(c++)相关推荐

  1. 二叉树——重建二叉树

    二叉树--重建二叉树 例如,某二叉树为: 前序遍历为:(4,7,9,2,1,5,6) 中序遍历为:(7,9,4,1,2,6,5) 后序遍历为:(9,7,1,6,5,2,4) 1.前序遍历+中序遍历 = ...

  2. Uva536 Tree Recovery二叉树重建(先序和中序确定二叉树,后序输出)

    题目大意:给定二叉树先序和中序遍历,输出二叉树后序遍历. 方法:将英文字母映射为数字,利用数组存储,先序第一个节点是父节点,然后再从中序遍历中找到位置.注意边界.代码也很简单一次ac. #includ ...

  3. 习题6_3 二叉树重建(Tree Recovery, ULM 1997, UVa536)

    题目描述: 输入一棵树的先序遍历和中序遍历序列,输出后序遍历序列 AC代码: #include<cstdio> #include<cstring>const int MAX_N ...

  4. 二叉树重建(前中序遍历求后序模板刘汝佳小白本)

    输入一棵二叉树的先序遍历和中序遍历序列,输出它的后序遍历序列. 输入: DBACEGF ABCDEFG BCAD CBAD 输出: ACBFGED CDAB #include<stdio.h&g ...

  5. 清华数据结构真二叉树重建AC100

    该题难点主要在于如何判断哪边是左子树,哪边是右子树 假设先序序列为a[maxn],后序序列为b[maxn] 对于类似数据为 13 1 2 4 6 10 9 12 13 7 11 8 5 3 10 12 ...

  6. 习题6-3 二叉树重建(Tree Recovery, ULM 1997, UVa 536)

    经典的分治法.. #include <iostream> #include <string> #include <vector> #include <stac ...

  7. 习题6-3 二叉树重建(Tree Recovery,ULM 1997,UVa 536)

    原题链接:https://vjudge.net/problem/UVA-536 分类:树 备注:水题 代码如下: #include<cstdio> #include<string&g ...

  8. 根据前序、中序序列重建一棵二叉树的代码实现

    //根据前序.中序重建二叉树 BitTree* reConstructBinTree(int pre[], int startPre, int endPre,int in[], int startIn ...

  9. c语言判断一个已知的二叉树是否是二叉排序树_10584 二叉树怎样序列化才能重建...

    「序列化」(serialization),指的是把复杂的数据结构转化为线性结构,以方便存储的过程.序列化得到的线性结构必须能重建出原有的结构,才有意义. 对于二叉树,常用的序列化方法是在树上进行某种遍 ...

最新文章

  1. Android 工程报错解决 Unable to resolve target 'android-17'
  2. python之matloplib可视化
  3. Apache Flink 零基础入门(二十一)Flink HistoryServer概述与配置
  4. 常见问题及解决方案(前端篇)
  5. 玛纽尔扫地机器人怎样_扫地机器人哪个牌子好?满足日常清洁需求才值得推荐...
  6. python实时绘图暂停_Python实时绘图
  7. html中如何设计对话框,用纯css3和html制作泡沫对话框实现代码
  8. np.stack()函数详解 ==>堆叠 【类似于torch.stack()】
  9. [每日一题] OCP1z0-047 :2013-07-13 oracle 10g正则表达式 REGEXP_LIKE 用法
  10. 腾讯QQ群视频功能“视频秀”即将上线
  11. 81页智慧城市-大数据决策与支撑平台解决方案
  12. groovy 打印json_groovyJSON - Groovy教程
  13. 多元线性回归矩阵求导
  14. 利用lavarel框架实现Todos App
  15. C语言入门练习— —累乘
  16. android实现接口的原则,《Android之大话设计模式》--设计原则 第一章:针对接口编程 不要针对实现编程...
  17. 10 个用于收集硬件信息的 Linux 命令
  18. “豪”秀上演——莱佛士学生作品精彩亮相施华蔻发布会
  19. oracle扩充表空间
  20. np.c_ 对比 np.r_

热门文章

  1. 40.简述操作系统中调用过程?
  2. 计算机专业的书普遍都这么贵,Github上的计算机电子书很多~~~
  3. 中山大学2020计算机学院复试分数线,2020中山大学研究生分数线汇总(含2016-2020历年复试)...
  4. word邮件合并一页8个_办公软件小课堂||word邮件合并
  5. java根据日期判断星座_根据日期计算星座
  6. 电脑切换用户关闭计算机会怎样,电脑中的“睡眠、关机、注销、切换用户、待机、休眠”都什么意思?有什么区别...
  7. java nio单线程6_Java NIO6:选择器2---代码篇
  8. Python---已知Person类,继承Person类生成Teacher类(增加参数:科目)和Student类(增加参数:专业)。
  9. 033_jdbc-mysql数据库连接池
  10. Unity5x编辑器的主菜单和布局