为什么由二叉树的中序和前序遍历序列可以唯一确定一棵二叉树,而由前序和后序遍历则不能
二叉树是最为常用的数据结构,它的实际应用非常广泛。二叉树的遍历方式有三种,前序遍历、中序遍历、后序遍历。先序遍历的顺序为: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总结�
在二叉树的一些应用中,如平衡二叉树、红黑树等,常常要观察二叉树的形态,对其进行判断并调整。根据遍历序列和二叉排序树的性质快速还原出二叉树对于研究相关的问题有很大的帮助。
在二叉树结点的先序序列、中序序列和后序序列中,所有叶子结点的先后顺序...
这意味着无论你从哪个方向遍历二叉树先序、中序或后序,叶子节点的顺序都是相同的。先序遍历的顺序是根节点-左子树-右子树,中序遍历的顺序是左子树-根节点-右子树,后序遍历的顺序是左子树-右子树-根节点。虽然这三种遍历方式的顺序有所不同,但叶子节点的顺序在所有遍历方式中都是一致的。这个性质...
二叉树的先序、中序和后序序列问题
先序的第二个元素是B,所以B是A的左子树根节点 由中序B在最前,知道其他元素都在B的右子树上 所以,后序序列为(DE_)B(G_H)A,对比已有的后序序列_DC_GH_A 得后序序列为:EDCBGHFA,中序序列为:BDECAGFH 先序序列 ABC_EF__中序序列 BDECAGFH 后序序列 EDCBGHFA 所以,二叉树为...
什么情况下二叉树的中序和后序序列相同
二叉树在没有右子树的情况下,二叉树的中序和后序序列是相同的。分析如下:二叉树的中序序列为:左子树、根、右子树;二叉树的后序序列为:左子树、右子树、根;要想使二叉树的中序和后序序列相同,则只有两种情况可以满足:1、没有根的二叉树,然而根据二叉树的性质可知,所有的二叉树都有有根...
已知二叉树的中序遍历结果: BDCEAFHG。后序遍历结果:DECBHGFA,画出此二 ...
端,所以HG是F的右子树;5、由于H、G在后序遍历序列G最后出现,所以G是H, G中的根,再看 中序中G左端只有一个H,所以H是G的左子树,得到最终原始二叉树。需要注意的几点:1、根是相对的,对于整棵树而言只有一个根,但对于每棵子树而言,又有自己的根。2、前序遍历时,一棵树的根永远在左...
二叉树先序序列和中序序列相同的条件是什么
二叉树先序遍历就是先访问自己,然后左子树,然后右子树。二叉树的中序遍历是先访问左子树,然后访问自己,最后右子树。所以要让上述两个过程一样,唯一的办法就是左子树不存在,也就是对于二叉树上的任意节点,他的左子节点为空。每一层上的结点数都是最大结点数。而在一棵二叉树中,除最后一层外...
设一颗二叉树的中序遍历结果是DBEAFC,前序遍历结果是ABDECF,则后序便利...
结果如下:A B FC D E 下面再看FC两个节点,他们在前序遍历结果中的结果是CF,所以C是这两个节点中的根节点,再根据他们在中序遍历结果中的顺序FC,则F将他们本身划分为左子树(此时为空)和右子树C,则二叉树示意图如下:A B C D E 空 F ...
已知某二叉树的后序遍历序列是DACBE,中序遍历序列是DEBAC,则它的的前...
后序遍历顺序是“左子树―右子树―树根节点”:中序遍历是“左子树-树根节点-右子树”,前序遍历是“树根节点―左子树―右子树”。二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有的结点,使得每个结点被访问依次且仅被访问一次。四种遍历方式分别为:先序...
什么叫二叉树的中序序列?
先、中、后都是对跟来讲的 中序序列就是中序遍历得到的序列 先序序列和中序序列相同的二叉树一定是空树吗?不是,那只说明每个节点只有右孩子而已
二叉树中的中序遍历和先序遍历是什么意思?
对于左子树、右子树按同样方式:左:先遍历出a,然后父节点c,右子树再先遍历左儿子b,父节点d 左子树为acbd 加上根节点f 右子树继续这样,就得到你上面的答案了 void print(tree a)\/\/假设为中序遍历树的函数 { print(a->left);\/\/先左儿子 printf("%d\\n",a->e);\/\/输出父节点的值 prin...
二叉树是怎么遍历的?
2、中根遍历一般指中序遍历,在二叉树中,中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。若二叉树为空则结束返回,否则:(1)中序遍历左子树 (2)访问根结点 (3)中序遍历右子树 如右图所示二叉树,中根遍历结果:DBEAFC 3...
尹先杞菊:[答案] 前序和后序在本质上都是将父节点与子结点进行分离,但并没有指明左子树和右子树的能力,因此得到这两个序列只能明确父子关系,而不能确定一个二叉树.
松溪县17568547127: C++中二叉树的前序(后序、中序)遍历分别是什么意思?相应的树图怎么看? - ?
尹先杞菊: 二叉树的遍历是指按照一定次序访问树中所有结点,并且每个节点仅被访问一次的过程. 1、先序遍历(前序) (1)访问根节点; (2)先序遍历左子树; (3)先序遍历右子树. 2、中序遍历 (1)中序遍历左子树; (2)访问根节点; (3...
松溪县17568547127: 为什么由二叉树的中序序列及前序序列唯一确定二叉树? - ?
尹先杞菊: 由后序和中序也可以确定 后序 DCFEBIHGA 中序 DCBFEAGHI 后序的最后一个元素是根,依据中序序列,就可把根的左右子树分出来.比如第一题,A是根,再根据中序知:其左子树是(DCBFE),右子树是(GHI).对每一个子树,又可根据这个原则继续分析下去:(IHG)的最后A的右子树的根是G,一个,G的右子树是H,H的右子树是IA/ \B G/ \ \HC E \ / / I D F
松溪县17568547127: 为什么由二叉树的中序序列及前序序列唯一确定二叉树?为什么由后序和中序就不能?解释一下可以倒是可以确定,我的意思是为什么由前序和中序确定的就... - ?
尹先杞菊:[答案] 由后序和中序也可以确定后序 DCFEBIHGA 中序 DCBFEAGHI后序的最后一个元素是根,依据中序序列,就可把根的左右子树分出来.比如第一题,A是根,再根据中序知:其左子树是(DCBFE),右子树是(GHI).对每一个子树,又可根据...
松溪县17568547127: 下面二叉树的前序遍历,中序遍历,后序遍历分别为什么? - ?
尹先杞菊: 中序遍历结果是DBEAFC,前序遍历结果是ABDECF,则后序遍历结果是DEBFCA (因为前序遍历结果是ABDECF,知道根结点为A,中序遍历结果是DBEAFC,知道DBE为左子树,FC为右子树,再推出DE是B的叶子结点,F是C的叶子结点...
松溪县17568547127: 二叉树的前中后序遍历有什么意义 - ?
尹先杞菊: 一般二叉树都是通过扩展二叉树的前序序列来建立.这个题目的建立方式有点臃肿.由于信息很冗余,题目也没有要求建立二叉链表,这儿直接用数组顺序存储就可以了.struct node{ int left; int right; }; node arr[20]; int N=0; using namespace std; void PreOrderTraverse(int a) {
松溪县17568547127: 已知某二叉树的后序遍历是DACBE,中序遍历序列是DEBAC,则它的前序遍历序列是? 答案是EDBAC,为什么呢? - ?
尹先杞菊: 由于后序遍历序列中排在最后的是E,说明E是根结点;又由于中序遍历序列中仅D排在E之前,其余的结点B、A、C相继排在E之后,说明D为根结点E的左子树,其余的结点B、A、C在根结点E的右子树上,结构如下图所示: 后序遍历序列中B排在E的前一位,说明B就是根结点E的右子树的根,即B是E的右孩子,再结合中序遍历序列,可以发现B没有左孩子,那么结点A、C均在结点B的右子树上,结构如下图所示: 后序遍历序列中A排在C的前一位,说明A是C的孩子,而中序遍历序列中A也排在C的前一位,可以进一步确定A是C的左孩子,这样的话,该二叉树完整的结构图应为:那么,该二叉树的正确前序遍历序列应该为 EDBCA.
松溪县17568547127: 已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历是什么? - ?
尹先杞菊: 已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历是DGEBHFCA. 前序遍历的第一个节点为根节点,由前序遍历可知,A为根节点.中序遍历的根节点前面的节点均为左子树的节点,所以左子树上...
松溪县17568547127: 二叉树遍历问题(前序,中序,后序) - ?
尹先杞菊: 前序遍历(DLR) 前序遍历也叫做先根遍历,可记做根左右. 前序遍历首先访问根结点然后遍历左子树,最后遍历右子树.在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树. 若二叉树为空则结束返回,否则: ...
松溪县17568547127: 设一棵二叉树的中序遍历序列为BDCA,后序遍历序列为DBAC,则这棵二叉树的前序序列 - ?
尹先杞菊: 这个先根据后序遍历确定根节点为C.再根据中序遍历得到根节点的右孩子为A.然后根据后序遍历确定,B是根节点的左孩子,D是B的孩子.再根据中序遍历,得到D是B的右孩子.根据这个画出二叉树. 前序遍历结果是:CBDA.扩展资...