二叉树 前序ABLECFDGI 后序LEBFCIGHDA 问该树能否唯一确定?不能的话给出反例吧~
知道先序后序不能重构二叉树
只有知道先序/后序中的其中一个和中序一起再能重构二叉树
假设有先序12435,后序42531
那么中序可以是42135,42153,24135,24153,42351,42531......等等!!
应该还有很多情况,一时之间想不了那么多,有兴趣自己想去!!!总之就是不行了
序、中序或由中序、后序遍历结果快速还原二叉树的方法。�
二叉树是最为常用的数据结构,它的实际应用非常广泛。二叉树的遍历方式有三种,前序遍历、中序遍历、后序遍历。先序遍历的顺序为:NLR,即先根结点,然后左子树、右子树;中序遍历顺序为:LNR先左子树,然后根结点、右子树;后序遍历顺序为:LRN先左子树、然后右子树、根结点。由前序和中序遍历、由中序和后序遍历序列可以唯一确定一棵二叉树,而由前序和后序遍历序列不能唯一确定一棵二叉树。�
二叉排序树对二叉树作了进一步的限定:根结点的权值大于(或小于)左子树中所有结点的权值;根结点的权值小于(或大于)其右子树中所有结点的权值。�
那么如何根据三种遍历序列之间的关系及二叉排序树来快速还原一棵二叉树?下面以二叉树的前序和中序遍历序列为基础,利用二叉排序树的性质,给出快速还原二叉树的方法。�
1由给定前序和中序序列或中序和后序序列还原二叉树的方法�
例:前序序列:ABDECFGH 中序序列:DEBACGFH (后序序列:EDBGHFCA)�
(1)给中序序列中的每个结点从小到大、从左到右赋以权值,如下:�
D(1)E(2)B(3)A(4)C(5)G(6)F(7)H(8)�
(2)还原时读入的序列为前序序列,从左到右依次读入序列中的各个结点值和相应的权值; �
(3)由读入的序列,根据第1)步中给定的权值按照二叉排序树的构造规则构造二叉排序树。第一个读入的结点为根结点,其他结点分别为左右子树中的结点。设根结点为TT,权值为NN,当前读入结点为SS,权值为MM,若MM
(4)将SS插入到TT的左子树或右子树的过程中,仍然遵循3)中的规则,直至左子树或右子树为空时止。�
(5)读入序列结束时,二叉树还原成功。�
6)对于由中序序列和后序序列还原二叉树是,读入的序列为后序序列,从右向左读入,构造规则同上。还原结果与上述结果完全一致。�
2还原方法的确定依据�
二叉树遍历过程中,在中序序列中,根结点的左子树中的所有结点都在根结点的左侧,根结点的右子树中的所有结点都在根结点的右侧,这个特点恰好与二叉排序树具有相同的性质;在读入序列时,前序序列则从左向右读,这恰好与遍历二叉树的顺序相同;后序序列从右向左读,则按照根结点、右子树、左子树的顺序还原。�
(1)设二叉树共有N个结点(N为大于1的正整数),我们按照还原方法给中序序列中的这N个结点分别赋予权值1,2…N,设根结点的权值为M(1
(2)由二叉树的遍历规则可知,权值为1,2…M-1的结点为根结点的左子树中的结点,而权值为M+1,…N的结点为根结点的右子树中的结点。�
(3)将这N个结点划分成3个子集AA=(1,2…M-1)BB=(M)CC=(M+1,…N),由于前序序列第一个读入的结点必定为二叉根的根结点,所以BB为根结点,AA集为左子树,CC集为右子树。�
(4)同理不断读入前序序列中的结点,依次递归还原BB对应的左子树和CC对应的右子树,最后将三棵子树合并成以BB为根结点、AA的根结点为BB的左子树、CC的根结点为BB的右子树的一棵二叉排序树。�
(5)同理可以得出,由中序序列和后序序还原二叉树的规则也成立。�
(6)在还原过程中,读入序列的顺序也遵循也先根结点,后子树的规律。�
3总结�
在二叉树的一些应用中,如平衡二叉树、红黑树等,常常要观察二叉树的形态,对其进行判断并调整。根据遍历序列和二叉排序树的性质快速还原出二叉树对于研究相关的问题有很大的帮助。
只有当正则二叉树,也就是只有度为0和度为2结点的二叉树(没有度为1的结点)才能够由正确的前序+后序序列唯一确定
拔肃新活: 你的这个前序序列+后序序列根本不能唯一地确定二叉树,具体过程就是根据前序和后序的性质来回切分,但是刚刚可以切分到左子树根为B,右子树的根为D,下面切分不下去了,并且序列也出现矛盾了 只有当正则二叉树,也就是只有度为0和度为2结点的二叉树(没有度为1的结点)才能够由正确的前序+后序序列唯一确定
绥化市17315442941: 一棵二叉树的先根遍历为ABCDEFG,中根遍历为CBDEAGF,则其后根遍历为 - ?
拔肃新活: 这里的“先根”也叫做先序,“中”和“后”也一样. 先序遍历是先访问当前节点,然后再遍历左子树,最后是右子树. 中序遍历是先遍历左子树,再访问当前节点,最后是右子树. 后序遍历是先遍历左子树,再遍历右子树,最后访问当前节...
绥化市17315442941: 设某二叉树的前序序列为ABC,中序序列为CBA,则后序序列为? - ?
拔肃新活: 设某二叉树的前序序列为ABC,中序序列为CBA,则该二叉树的后序序列为 CBA .
绥化市17315442941: 如果一颗二叉树的先序遍历序列是ABDFCEG,中序遍历序列是DFBACEG,则它的后序遍历序列是? - ?
拔肃新活: 1. 先序ABDFCEG,则A为根 2. 中序DFBACEG,则A左边的DFB为左子树,A右边的CEG为右子树 3. 左子树先序BDF,中序DFB 3.1. 先序BDF,则B为根 3.2. 中序DFB,则B左边的DF为左子树,D右边没有右子树 3.3. 左子树先序DF,中序DF ...
绥化市17315442941: 已知某二叉树的前序是abdgcefh,中序dgbaechf,则后序是? - ?
拔肃新活: 首先我们知道,前序遍历的规则是:根结点→左子结点→右子结点 中序遍历是:左子结点→根结点→右子结点 后序遍历是:左子结点→右子结点→根结点 那么,对于一棵二叉树,前序遍历的第一个结点一定是这棵树的根结点,即根结点是a. ...
绥化市17315442941: C++中二叉树的前序(后序、中序)遍历分别是什么意思?相应的树图怎么看? - ?
拔肃新活: 二叉树的遍历是指按照一定次序访问树中所有结点,并且每个节点仅被访问一次的过程. 1、先序遍历(前序) (1)访问根节点; (2)先序遍历左子树; (3)先序遍历右子树. 2、中序遍历 (1)中序遍历左子树; (2)访问根节点; (3...
绥化市17315442941: 已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历是什么? - ?
拔肃新活: 已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历是DGEBHFCA. 前序遍历的第一个节点为根节点,由前序遍历可知,A为根节点.中序遍历的根节点前面的节点均为左子树的节点,所以左子树上...
绥化市17315442941: 二叉树遍历问题(前序,中序,后序) - ?
拔肃新活: 前序遍历(DLR) 前序遍历也叫做先根遍历,可记做根左右. 前序遍历首先访问根结点然后遍历左子树,最后遍历右子树.在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树. 若二叉树为空则结束返回,否则: ...
绥化市17315442941: 某二叉树的前序遍历访问顺序是abdgcefh,中序遍历的访问顺序是dgbaechf,问后序遍历的访问顺序?? - ?
拔肃新活: 前序遍历中,a是根,故在中序遍历中在a前的为左子树(即dgb),在a后的为右子树J(即echf). 由于树是递归结构,据此可以推出左右子树的根.举例来说,对于左子树dgb,在前序中b在前,故b是左子树的根,在中序中,dg皆在b前,故dg在b的左子树上. 总之,在前序中找树根,找到树根后,再到中序中找左右子树----在根前的在左子树上,在根后的在右子树上. 把树的形态确定后,再写后序遍历就不难了.结果是:gdbehfca.
绥化市17315442941: 一棵二叉树结点的前序序列为abdegcfhi,对称序序列为dbgeachfi,则该二叉树结点的后序序列为? - ?
拔肃新活: 对称序序列应该是中序序列吧 那么后序序列应该为 dgebhifca 前序序列为 根左右,中序序列为 左根右,后序序列为 左右根 根据上述原理和题目给的条件首先可推出二叉树的根结点为 a左子树有结点bdeg 右子树有结点 cfhi 依此类推可画出相应的二叉树结构 因而得到后序序列