二叉树重建(c++)
题目描述(剑指offer)
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++)相关推荐
- 二叉树——重建二叉树
二叉树--重建二叉树 例如,某二叉树为: 前序遍历为:(4,7,9,2,1,5,6) 中序遍历为:(7,9,4,1,2,6,5) 后序遍历为:(9,7,1,6,5,2,4) 1.前序遍历+中序遍历 = ...
- Uva536 Tree Recovery二叉树重建(先序和中序确定二叉树,后序输出)
题目大意:给定二叉树先序和中序遍历,输出二叉树后序遍历. 方法:将英文字母映射为数字,利用数组存储,先序第一个节点是父节点,然后再从中序遍历中找到位置.注意边界.代码也很简单一次ac. #includ ...
- 习题6_3 二叉树重建(Tree Recovery, ULM 1997, UVa536)
题目描述: 输入一棵树的先序遍历和中序遍历序列,输出后序遍历序列 AC代码: #include<cstdio> #include<cstring>const int MAX_N ...
- 二叉树重建(前中序遍历求后序模板刘汝佳小白本)
输入一棵二叉树的先序遍历和中序遍历序列,输出它的后序遍历序列. 输入: DBACEGF ABCDEFG BCAD CBAD 输出: ACBFGED CDAB #include<stdio.h&g ...
- 清华数据结构真二叉树重建AC100
该题难点主要在于如何判断哪边是左子树,哪边是右子树 假设先序序列为a[maxn],后序序列为b[maxn] 对于类似数据为 13 1 2 4 6 10 9 12 13 7 11 8 5 3 10 12 ...
- 习题6-3 二叉树重建(Tree Recovery, ULM 1997, UVa 536)
经典的分治法.. #include <iostream> #include <string> #include <vector> #include <stac ...
- 习题6-3 二叉树重建(Tree Recovery,ULM 1997,UVa 536)
原题链接:https://vjudge.net/problem/UVA-536 分类:树 备注:水题 代码如下: #include<cstdio> #include<string&g ...
- 根据前序、中序序列重建一棵二叉树的代码实现
//根据前序.中序重建二叉树 BitTree* reConstructBinTree(int pre[], int startPre, int endPre,int in[], int startIn ...
- c语言判断一个已知的二叉树是否是二叉排序树_10584 二叉树怎样序列化才能重建...
「序列化」(serialization),指的是把复杂的数据结构转化为线性结构,以方便存储的过程.序列化得到的线性结构必须能重建出原有的结构,才有意义. 对于二叉树,常用的序列化方法是在树上进行某种遍 ...
最新文章
- Android 工程报错解决 Unable to resolve target 'android-17'
- python之matloplib可视化
- Apache Flink 零基础入门(二十一)Flink HistoryServer概述与配置
- 常见问题及解决方案(前端篇)
- 玛纽尔扫地机器人怎样_扫地机器人哪个牌子好?满足日常清洁需求才值得推荐...
- python实时绘图暂停_Python实时绘图
- html中如何设计对话框,用纯css3和html制作泡沫对话框实现代码
- np.stack()函数详解 ==>堆叠 【类似于torch.stack()】
- [每日一题] OCP1z0-047 :2013-07-13 oracle 10g正则表达式 REGEXP_LIKE 用法
- 腾讯QQ群视频功能“视频秀”即将上线
- 81页智慧城市-大数据决策与支撑平台解决方案
- groovy 打印json_groovyJSON - Groovy教程
- 多元线性回归矩阵求导
- 利用lavarel框架实现Todos App
- C语言入门练习— —累乘
- android实现接口的原则,《Android之大话设计模式》--设计原则 第一章:针对接口编程 不要针对实现编程...
- 10 个用于收集硬件信息的 Linux 命令
- “豪”秀上演——莱佛士学生作品精彩亮相施华蔻发布会
- oracle扩充表空间
- np.c_ 对比 np.r_
热门文章
- 40.简述操作系统中调用过程?
- 计算机专业的书普遍都这么贵,Github上的计算机电子书很多~~~
- 中山大学2020计算机学院复试分数线,2020中山大学研究生分数线汇总(含2016-2020历年复试)...
- word邮件合并一页8个_办公软件小课堂||word邮件合并
- java根据日期判断星座_根据日期计算星座
- 电脑切换用户关闭计算机会怎样,电脑中的“睡眠、关机、注销、切换用户、待机、休眠”都什么意思?有什么区别...
- java nio单线程6_Java NIO6:选择器2---代码篇
- Python---已知Person类,继承Person类生成Teacher类(增加参数:科目)和Student类(增加参数:专业)。
- 033_jdbc-mysql数据库连接池
- Unity5x编辑器的主菜单和布局