题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如输入前序遍历序列{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;
} };
 

剑指offer重构二叉树 给出二叉树的前序和后序重构二叉树的更多相关文章

  1. 《剑指offer》面试题24 二叉搜索树的后序遍历序列 Java版

    (判断一个元素均不相同的序列是否为一个BST的LRD) 书中方法:首先对于二叉搜索树,左子树中的所有元素小于根节点小于右子树中的所有元素,然后后序遍历序列最后一个元素是根节点,这是我们已知的条件.这道 ...

  2. 剑指offer面试题24:二叉搜索树的后序遍历序列

    题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是返回true,否则返回false. 假设输入的数组任意两个数字都不相同 解题思路:二叉搜索树的特点是根节点的左子树的值小于等 ...

  3. 《剑指offer》面试题33. 二叉搜索树的后序遍历序列

    问题描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同.   参考以下这颗二叉搜索树: 5 / \ ...

  4. 剑指Offer面试题:22.二叉搜索树的后序遍历序列

    一.题目:二叉搜索树的后序遍历序列 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 例如在下面 ...

  5. 剑指Offer(二十二):从上往下打印二叉树

    剑指Offer(二十二):从上往下打印二叉树 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...

  6. 【剑指offer】堆栈推弹出序列

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26077863 剑指offer上的第22题,九度OJ上AC. 题目描写叙述: 输入两个整数序 ...

  7. 剑指offer——面试题32.1:分行从上到下打印二叉树

    void BFSLayer(BinaryTreeNode* pRoot) { if(pRoot==nullptr) return; queue<BinaryTreeNode*> pNode ...

  8. 剑指offer:1.找出数组中重复的数(java版)

    数组中重复的数:题目:找出数组中重复的数,题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任 ...

  9. 剑指 offer set 20 打印出和为 s 的连续正序序列

    题目 100 可以由 9~16, 或者 18 ~ 22 组成 思路 1. 与 Leetcode Container With Most Water 有些类似, 依然是平移题目. 但这道更加复杂 2. ...

随机推荐

  1. Guard Duty (medium) Codeforces - 958E2 || (bzoj 2151||洛谷P1792) 种树 || 编译优化

    https://codeforces.com/contest/958/problem/E2 首先求出N个时刻的N-1个间隔长度,问题就相当于在这些间隔中选K个数,相邻两个不能同时选,要求和最小 方法1 ...

  2. Bluefish

    Bluefish标榜其自身是“一款为熟练的Web设计员和程序员而设的编辑器,但它的UI却很直观,任何初学者都能够很快上手,并在不断地积累中发现和掌握它的其它功能.   Bluefish标榜其自身是“一 ...

  3. ajax学习和总结

    Jquery AJAX http://www.cnblogs.com/jayleke/archive/2012/08/10/2633174.html http://www.php100.com/htm ...

  4. linux下mysql中文乱码

    登录mysql执行mysql> show variables like 'character%';发现编码有些不是utf-8 修改/etc/mysql/my.cnf,网上说的是/etc/my.c ...

  5. CF1072C Cram Time

    思路: 首先二分找到使x * (x + 1) / 2 <= a + b最大的x,然后令p = min(a, b), q = max(a, b),按照x,x - 1, ..., 1的顺序选取数字把 ...

  6. C#调用C库的注意事项

    作者:朱金灿 来源:http://blog.csdn.net/clever101 注意事项一: 从C#的exe进入C库的源码进行调试,需要先"启用非托管代码调试",如下图: 注意事 ...

  7. [Ubuntu]清除系统磁盘垃圾

    操作步骤: 1.sudo apt-get autoremove(卸载系统中所有未被使用的依赖关系) 2.sudo apt-get clean(清除所有缓存的包文件) 以上操作绿色无害,对系统无影响.

  8. siege4压测脚本示例

    agent="Siege 1.0"rcconfig="/opt/siege4.0/etc/siegerc"concurrent=$1repet=$2url=&q ...

  9. ios UI自动化测试

    转载:http://www.cnblogs.com/dokaygang128/p/3517674.html 一.一些注意事项: 1.做自动化测试时注意如果是真机话首先要设置不锁屏. 2.自动化测试过程 ...

  10. 洛谷 P2126 Mzc家中的男家丁

    题目背景 mzc与djn的…还没有众人皆知,所以我们要来宣传一下. 题目描述 mzc家很有钱(开玩笑),他家有n个男家丁,现在mzc要将她们全都聚集起来(干什么就不知道了).现在知道mzc与男家丁们互 ...