一题一算法2018-02-06(重建二叉树)

题目:重建二叉树


题目描述:

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


题目知识:

首先看题目应该最先看到的是这个几个关键点:1、二叉树,2、二叉树的前中后三种遍历。
先序遍历:遍历规则 根-左-右
中序遍历:遍历规则 左-根-右
后序遍历:遍历规则 左-右-根

image.png

接下来的排序:
先序遍历:ABCDEFGHK
中序遍历:BDCAEHGKF
后序遍历:DCBHKGFEA
先说中序遍历,先序遍历的规则是左根右
此时A是根节点,遍历A的左子树;
A的左子树存在,找到B,此时B看做根节点,遍历B的左子树;
B的左子树不存在,返回B,根据【左根右】的遍历规则,记录B,遍历B的右子树;
B的右子树存在,找到C,此时C看做根节点,遍历C的左子树;
C的左子树存在,找到D,由于D是叶子节点,无左子树,记录D,无右子树,返回C,根据【左根右】的遍历规则,记录C,遍历C的右子树;
C的右子树不存在,返回B,B的右子树遍历完,返回A;
至此,A的左子树遍历完毕,根据【左根右】的遍历规则,记录A,遍历A的右子树;
A的右子树存在,找到E,此时E看做根节点,遍历E的左子树;
E的左子树不存在,返回E,根据【左根右】的遍历规则,记录E,遍历E的右子树;
E的右子树存在,找到F,此时F看做根节点,遍历F的左子树;
F的左子树存在,找到G,此时G看做根节点,遍历G的左子树;
G的左子树存在,找到H,由于H是叶子节点,无左子树,记录H,无右子树,返回G,根据【左根右】的遍历规则,记录G,遍历G的右子树;
G的右子树存在,找到K,由于K是叶子节点,无左子树,记录K,无右子树,返回G,根据【左根右】的遍历规则,记录F,遍历F的右子树;
F的右子树不存在,返回F,E的右子树遍历完毕,返回A;
至此,A的右子树也遍历完毕;
那么接下来的前序和后序遍历类似的方式遍历。

题目分析

已知当知道先序中序遍历的序列,或者知道中序后序遍历序列时我们可以唯一确定一个二叉树,当只知道先序后序的时候我们不能确定唯一的一棵树。
那我们先联系这样一个题目:
已知先序序列:ABCDEFGH,中序序列:BDCEAFHG,求出最终的序列来。
首先,先序和中序的遍历规则分别是根左右左根右,那么我们可以知道此序列的根节点是A,在中序序列中,BDCE是A的左子树,FHG是A的右子树。

image.png

于是先序遍历也就分成这样的
image.png

而B又在先序遍历中是A左子树的根节点,再回到中序遍历中B是A座子树的根节点,那么DCE就是B的右子树,那么此时的图就变成了
image.png

那么我们接下来在看CDE,看先序遍历知道CCDE的根节点,再根据中序遍历DCE知道D是C的左叶子节点,E是C的有叶子节点,那么此时我们的整个左子树完成了。
image.png

我们同样对右子树进行操作,在先序中右子树的顺序是:FGH,那么此右子树的根节点是F,再看中序的顺序是:FHG,F是根节点,那HG是F的右子树

image.png

再看先序遍历发现接下来的根节点是G,那么F的右子树节点是G,再看中序遍历的结果HG,H是G的左子树。
image.png

接下来
我们知道中序遍历:CEDFBAHG,后序遍历:EFDCBHGA
我们知道:
1、根据后序遍历知道此二叉树的根节点是A,那么在中序遍历中我们就可以分成左子树:CEDFB,右子树HG。
2、先看左子树的后序:EFDCB,我们知道左子树的根节点是B,再到中序CEDFB中我们知道。CEDF是B的左子树。
3、后序:EFDC,知道B的左子树的根节点是C,,而在中序CEDF中我们知道EDF是C的右子树
4、后序:EFD,知道C的右子树的根节点是D,而在中序EDF中我们知道E和F分别是D的左叶子节点和有叶子结点
5、中序:HG,我们知道是A的右子树,后序中HGA,说明A的右子树的根节点是G。
6、中序遍历中是HG,说明H是G的左叶子节点

image.png

综上所述,我们可以知道从遍历中获取整个二叉树的方法

题目代码:

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        if(pre.size() != vin.size()||pre.size() == 0 || vin.size() == 0) return NULL;
        else{
            TreeNode* resNode = createTreeNodeHelper(pre,vin,0,0,vin.size()-1);
            return resNode;
        }
    }
    TreeNode* createTreeNodeHelper(vector<int> pre, vector<int> vin,int preRootPos,int vinLeft,int vinRight){
        // pre 前序 vin 中序 preRootPos 前序根节点位置 vinLeft 中序左边界 vinRight 中序右边界
        int vinRootPos,rootVal;
        rootVal = pre[preRootPos];//前序遍历中根节点位置的值
        if(vinLeft>vinRight) return NULL;
        for(int i = vinLeft; i<=vinRight;i++){
            if(vin[i] == rootVal)
                vinRootPos = i; //根据根节点找到中序中根节点的位置vinRootPos,
        }
        int leftLen = vinRootPos - vinLeft;
        
        TreeNode* resRoot = new TreeNode(rootVal);
        resRoot->left = createTreeNodeHelper(pre,vin,preRootPos+1,vinLeft,vinRootPos-1);
        resRoot->right = createTreeNodeHelper(pre,vin,preRootPos+leftLen+1,vinRootPos + 1, vinRight);
        return resRoot;
    }
};

通过迭代的方式,不断查找。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 4,432评论 1 31
  • 这几天开学,学校还在上课,最近也是在找工作,很多天都没有更新文章,现在补一篇二叉树的文章。 最近校招公司的笔试陆续...
    zero_sr阅读 3,939评论 0 5
  • 数据结构和算法--二叉树的实现 几种二叉树 1、二叉树 和普通的树相比,二叉树有如下特点: 每个结点最多只有两棵子...
    sunhaiyu阅读 6,422评论 0 14
  • 给定一个前序和中序变量的结果,写一个算法重建这棵树:前序: a b d c e f中序: d b a e c f...
    HangChen阅读 529评论 0 3
  • 本文转自 http://www.cnblogs.com/manji/p/4903990.html二叉树-****你...
    doublej_yjj阅读 676评论 0 8