二叉树的扫描主要有三种:
(1)根;顺扫描;根左右) ) ) ) )。
)中(根)依次扫描;左根右) ) )。
(3)后)路线;依次扫描;左右路线) ) )。
举个例子:
前(根)序扫描)根左右) A B D H E I C F J K G
中(根)序扫描)左根右) : D H B E I A J F K C G
后(根)序扫描(左右根) :危机时) K F G C A
以以后的(根)顺序扫描为例,每次都是遍历树的左侧子树,接着遍历树的右侧子树,最后遍历根节点,直至遍历整个树。
另外,也有一个命题,即无论给定二叉树中的哪个扫描序列,都不能唯一地决定对应的二叉树。 但是,如果知道二叉树中顺扫描序列和任意别的扫描序列,就可以唯一地决定二叉树。
例子1:已知二叉树的后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是(cedba)。
(1)中序扫描: debac
反向遍历: dabec
可知c是根节点,因为最后的遍历序列的最后一个节点是根节点。
中序遍历序列的根节点位于中间,左侧为左子树,右侧为右子树。 因此,根据中顺扫描序列可知,根节点c只有左部分树,没有右部分树。
(2)中序扫描: deba
反向遍历: dabe
由于后行扫描序列的最后一个节点是根节点,所以可以看出e是c的左部分树的根节点。
中序遍历序列的根节点位于中间,左侧为左子树,右侧为右子树。 因此,根据顺序扫描序列可知根节点e的左子节点为d,右子树为ba。
(3)中序扫描: ba
后遍历: ab
根据以后的遍历序列可知,b是e的右部分树的根节点。 从中顺扫描序列可以看出,a是根节点b的右子节点。
树的结构如下
class Node: def __init__(self,dat,left=None, right=None ) : self.data=dat self.left=left self.left center (3360 if not rear : return cur=node (rear (-1 ) ) center [ :索引] (cur.right=rebuild (rear [索引:-1 ], center [ index 1: ] # rear [ index :-1 ]是倒数第二个数量的returncurdefpre_order(t ) :ift==none:returnprint )
例子2:已知二叉树的前序遍历序列是abdgcefh,中序遍历序列是dgbaechf,它的前序遍历序列是(gdbehfca)。超前遍历: abdgcefh
中序扫描: dgbaechf
由于先行遍历序列的第一个节点是根节点,所以可知a是根节点。
中序遍历序列的根节点位于中间,左侧为左子树,右侧为右子树。 因此,根据中顺扫描序列可知根节点a的左部分树是dgb,右部分树是echf。
(1)
a的左子树:超前遍历: bdg
中序扫描: dgb
可知,由于序列的第一个节点是根节点,所以b是a的左部分树的根节点。
中序遍历序列的根节点位于中间,左侧为左子树,右侧为右子树。 因此,根据中顺扫描序列可知,根节点b的左部分树是dg,没有右部分树。
(2)
b的左子树:超前遍历: dg
中序扫描: dg
从先行遍历序列可知,d是b的左部分树的根节点。
中序遍历序列的根节点位于中间,左侧为左子树,右侧为右子树。 因此,根据依次扫描序列可知根节点d的右子节点是g。
(3)
a的右子树:超前遍历: cefh
中序扫描: echf
从先行遍历序列可以看出,c是a的右部分树的根节点。
从该扫描序列可知,根节点c的左子节点为e,右子树为hf。
(4)
c的右子树:超前遍历: fh
中序扫描: hf
根据遍历序列可以看出f是c的右部分树的根节点。
从该扫描序列可知,根节点f的左子节点为h,没有右子树。
树的结构如下
class Node: def __init__(self,dat,left=None, right=None ) : self.data=dat self.left=left self.left center (3360 if not pre : return cur=node (pre [0] ) ) Inde ) cur.left=rebuild ) pre[13360]cur.left=rebuild ) 13 center [ : index ] (cur.right=rebuild (pre [ index ] center [ index 1: ] (returncurdefpost _ order (t ) : ift==none : return post _ order ) t.left ) post _ order irder