二叉树的遍历

转自:bebr的CSDN博客

二叉树的遍历主要有三种:

(1)先(根)序遍历(根左右)

(2)中(根)序遍历(左根右)

(3)后(根)序遍历(左右根)

举个例子:

 

先(根)序遍历(根左右):A B D H E I C F J K G

中(根)序遍历(左根右) : D H B E I A J F K C G

后(根)序遍历(左右根) : H D I E B J 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的右子结点。

树的结构如下:

 1 class Node:
 2     def __init__(self, dat, left=None, right=None):
 3         self.data = dat
 4         self.left = left
 5         self.right = right
 6  
 7  
 8 def rebuild(rear, center):
 9     if not rear:
10         return
11     cur = Node(rear[-1])
12     index = center.index(rear[-1])
13     cur.left = rebuild(rear[:index], center[:index])
14     cur.right = rebuild(rear[index:-1], center[index + 1:]) #rear[index:-1]是到倒数第二个数
15     return cur
16  
17  
18 def pre_order(t):
19     if t == None:
20         return
21     print(t.data)
22     pre_order(t.left)
23     pre_order(t.right)
24  
25  
26 if __name__ == "__main__":
27     rear = ['d','a','b','e','c']
28     center = ['d','e','b','a','c']
29     t = rebuild(rear, center)
30     pre_order(t)

例子2:已知二叉树的前序遍历序列是abdgcefh,中序遍历序列是dgbaechf,它的前序遍历序列是(gdbehfca)。

(1)先序遍历:abdgcefh

中序遍历:dgbaechf

先序遍历序列的第一个结点是根结点,所以可知a为根结点。

中序遍历序列的根结点在中间,其左边是左子树,右边是右子树。所以从中序遍历序列中可看出,根结点a的左子树是dgb,右子树是echf。

 

a的左子树:

(2)先序遍历:bdg

中序遍历:dgb

先序遍历序列的第一个结点是根结点,所以可知b为a的左子树的根结点。

中序遍历序列的根结点在中间,其左边是左子树,右边是右子树。所以从中序遍历序列中可看出,根结点b的左子树是dg,没有右子树。

 

b的左子树:

(3)先序遍历:dg

中序遍历:dg

由先序遍历序列可知d为b的左子树的根结点。

中序遍历序列的根结点在中间,其左边是左子树,右边是右子树。所以从中序遍历序列中可看出,根结点d的右子结点是g。

 

a的右子树:

(4)先序遍历:cefh

中序遍历:echf

由先序遍历序列可知c为a的右子树的根结点。

从中序遍历序列中可看出,根结点c的左子结点是e,右子树是hf。

 

c的右子树:

(5)先序遍历:fh

中序遍历:hf

由先序遍历序列可知f为c的右子树的根结点。

从中序遍历序列中可看出,根结点f的左子结点是h,没有右子树。

树的结构如下:

 1 class Node:
 2     def __init__(self, dat, left=None, right=None):
 3         self.data = dat
 4         self.left = left
 5         self.right = right
 6  
 7  
 8 def rebuild(pre, center):
 9     if not pre:
10         return
11     cur = Node(pre[0])
12     index = center.index(pre[0])
13     cur.left = rebuild(pre[1:index + 1], center[:index])
14     cur.right = rebuild(pre[index + 1:], center[index + 1:])
15     return cur
16  
17  
18 def post_order(t):
19     if t == None:
20         return
21     post_order(t.left)
22     post_order(t.right)
23     print(t.data)
24  
25  
26 if __name__ == "__main__":
27     pre = ['a','b','d','g','c','e','f','h']
28     center = ['d','g','b','a','e','c','h','f']
29     t = rebuild(pre, center)
30     post_order(t)

 

posted @ 2022-04-22 21:15  楚千羽  阅读(109)  评论(0编辑  收藏  举报