二叉树的遍历
转自: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)
作者:楚千羽
出处:https://www.cnblogs.com/chuqianyu/
本文来自博客园,本文作者:楚千羽,转载请注明原文链接:https://www.cnblogs.com/chuqianyu/p/16180561.html
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利!