题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},
则重建二叉树并输出它的后序遍历序列。
(测试用例中,"树"的输出形式类似于树的层次遍历,没有节点的用#来代替)
先序遍历:先遍历根节点,再遍历左子树,再遍历右子树,对子树采用相对规则遍历。
后序遍历:先遍历左子树,然后遍历右子树,最后遍历根节点,对子树采用相同规则。
分析:
 
1:每棵前序遍历的第一个元素,一定是这个树的根节点
2:对每棵树遍历后序遍历序列,找到与根节点元素相等节点的位置pos,根据后序遍历的特点,根节点向左的序列为做子树的后序遍历序列{4, 7, 2},根节点向右的序列为右子树的后序遍历序列{5, 3,  8, 6}.
3:根据根节点的位置可以节点的位置,可以分别求出,左右子树节点数量,这样可以在前序遍历中确认,左右子树的的前序遍历分别为{2, 4, 7},{3, 5, 6, 8}
4:对左右子树重复1,2,3步。
5:递归返回条件,一个节点不存在子树时返回。
 
c++代码实现
 
class Solution {
public:
struct TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in) {
if (pre.empty() || in.empty()) return NULL;
TreeNode *root = NULL;
root = Constructcore(pre, in, , (int)pre.size()-, , (int)in.size()-);
return root;
}
TreeNode *Constructcore(vector<int> pre, vector<int> in,
int startPre, int endPre,
int startIn, int endIn ){ int rootValue = pre[startPre];
TreeNode *root = new TreeNode(rootValue);
if (startPre == endPre){
if (startIn == endIn &&pre[startPre] == in[startIn])
return root;
}
int pos;
for (pos = startIn; pos <= endIn; pos++){
if (pre[startPre] == in[pos]) break;
}
int leftlength = pos - startIn;
int rightlength = endIn - pos;
if (leftlength > ){ root->left = Constructcore(pre, in, startPre + ,startPre + +leftlength,
startIn, pos -
);
}
if (rightlength > ){
root->right = Constructcore(pre, in, startPre + + leftlength, endPre,
pos + , endIn );
}
return root;
} };
 

最新文章

  1. MYSQL数据库忘记密码
  2. POJ 1177 Picture(求周长并)
  3. js 获取随机数
  4. javascript深入理解闭包(转)
  5. 如何用JAVA生成注册序列号
  6. ~/.bashrc的常用alias设置
  7. Lambda高手之路第二部分
  8. chd校内选拔赛题目+题解
  9. hadoop环境配置过程中可能遇到问题的解决方案
  10. LaTeX 公式编辑
  11. 从css 3d说到空间坐标轴
  12. CentOS 5.9裸机编译安装搭建LAMP
  13. CentOS yum换源
  14. CSS初识盒子
  15. POJ-2236.WireleseNetwork.(并查集)
  16. 分块入门(根据hzwer的博客。。)(右端点是r不是n。。)
  17. Winscp使用sudo user登录
  18. c#:HttpClient加标头
  19. sqlserver数据库查询,在数据类型不一致时容易出错
  20. Percona Server 5.6 安装TokuDB

热门文章

  1. [題解]luogu P1156 垃圾陷阱
  2. 爬虫的UA池和代理池
  3. 牛客寒假5-I.炫酷镜子
  4. 098 Validate Binary Search Tree 验证二叉搜索树
  5. [已读]JavaScript高级程序设计(第3版)
  6. 什么是OOA/OOD
  7. 第4章 变量、作用域和内存---JS红宝书书摘系列笔记
  8. 除虫记——有关WindowsAPI文件查找函数的一次压力测试
  9. Android中的Selector的使用总结
  10. ios 自定义消息提示框