二叉树的遍历
二叉树按照从左到右的规则,把六种遍历简化到只研究三种遍历:前序遍历(DLR),中序遍历(LDR),后序遍历(LRD)。
二叉树遍历的实质是递归。
目录
前序遍历
先访问根节点,再遍历左子树,最后遍历右子树。
中序遍历
先遍历左结点,再访问根节点,最后遍历有结点。
后序遍历
先遍历左结点,再遍历右结点,最后访问根节点。
![](https://img-blog.csdnimg.cn/20210510012613376.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzUwNjQ4NzMz,size_16,color_FFFFFF,t_70)
前序遍历:第一次:方位根节点A,左子树B(AB)。因为左子树B是下一个分支的根节点,所以暂时不到C,继续访问B。
第二次:访问根节点B,无左子树,遍历右子树D(ABD)。
第三次:访问根节点D,左子树F(ABDF),右子树G(ABDFG)。
以A为根节点的左子树遍历结束后,再遍历右子树。
第四次:访问C结点(ABDFGC),又因为C没有左子树,所以接下来到C的右子树E(ABDFGCE)。
第五次:访问根节点E(ABDFGCE),E没有左子树,然后到E的右子树H(ABDFGCEH)。
中序遍历:A有左子树,先遍历B。
B没有左子树,先B(B);B有右子树D,先D。
D有左子树F,先F(BF);F没有孩子结点,返回根节点D(BFD);D有右结点G(BFDG)。
以D为根节点的分支遍历结束,返回上一层B;以B为根节点的分支也遍历结束,返回上一层A;A的左子树被遍历,接下来到A(BFDGA)。
A有右子树C,且C没有左子树(BFDGAC),C有右子树E。
E没有左子树,先E(BFDGACE);E有右子树H,且F没有孩子结点(BFDGACEH)。
后序遍历:找没有孩子节点的最靠近左边的左子树,然后找右子树,鉴于篇幅原因,就不再赘叙。
FGDBHECA。
练习写出下列二叉树的前中后序遍历序列
答案在后面。
由两种遍历推到二叉树,得到另一种遍历序列
由三种遍历序列中的两种确定一个具体的二叉树是最常见的考题之一,具体题型有以下两种类型:
- 由前序遍历和中序遍历求的后序遍历
- 有后续遍历和中序遍历求得谦虚遍历
前序遍历的特点:第一个元素一定是根节点;
中序遍历的贴点:根节点的左侧是左子树,右侧是右子树;
后序遍历的特点:最后一个元素一定是根节点。
例:一直某二叉树的前序遍历序列为ABCDEFG,中序遍历序列为CAFGE,求后序遍历序列。
解:由前序遍历序列知:A是根节点;
由中序遍历序列知:CBD是左子树,FEG是右子树;
讨论A的左子树:左子树的前序遍历序列是BCD,中序遍历序列是CBD。
B是根节点,由中序遍历得CD是B的左右结点。
讨论A的右子树:右子树的前序遍历序列是EFG,中序遍历序列是FGE。
E是根节点,由中序遍历得FG是左结点,E没有右结点。
讨论E的左子树:左子树的前序遍历是FG,中序遍历是FG。
F是根节点,由中序遍历得G是F的右结点,F没有左结点。
![](https://img-blog.csdnimg.cn/20210510025730640.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzUwNjQ4NzMz,size_16,color_FFFFFF,t_70)
后序遍历为:CDBGFEA。
练习:已知某二叉树的中序遍历为ABCDEFG,后序遍历为BDCAFGE,求其前序遍历。
答案在后面。
答案
- 前序遍历:ABHFDECKG;中序遍历:HBDFAEKCG;后序遍历:HDFBKGCEA
- 前序遍历:ABDHIEJCFKG;中序遍历:HDIBEJAFKCG;后序遍历:HIDJEBKFGCA
- 前序遍历:-+a*bc/de;中序遍历:a+b*c-d/e;后序遍历:abc*+de/-
- 二叉树如如图
前序遍历为:EACBDGF
注释:
本人初创,疏漏之处,评论区欢迎指正。