课时59二叉树的的先序,中序,后序遍历
先序遍历,先根,左,右。
中序遍历:左-》根-》右
后序遍历:左-右-根。
class Node(object):
def __init__(self,item):
self.elem=item
#与链表不同的地方,链表只有一个后继的链接区域,而二叉树有两个
self.lchild=None
self.rchild=None
class Tree(object):
"""二叉树"""
def __init__(self):
self.root=None
def add(self,item):
node=Node(item)
if self.root is None:
self.root=node
return
queue=[self.root]
while queue:
#先从队列中取出一个节点
cur_node=queue.pop(0)
if cur_node.lchild is None:
cur_node.lchild=node
return
else:
queue.append(cur_node.lchild)
if cur_node.rchild is None:
cur_node.rchild=node
return
else:
queue.append(cur_node.rchild)
def breadth_trave(self):
"""广度遍历"""
queue=[self.root]
while queue:
cur_node=queue.pop(0)
print(cur_node.elem)
if cur_node.lchild is not None:
queue.append(cur_node.lchild)
if cur_node.rchild is not None:
queue.append(cur_node.rchild)
def preorder(self,node):
"""先序遍历"""
if node is None:
return
print(node.elem,end=" ")
self.preorder(node.lchild)
self.preorder(node.rchild)
def inorder(self,node):
"""中序遍历"""
if node is None:
return
self.inorder(node.lchild)
print(node.elem, end=" ")
self.inorder(node.rchild)
def postorder(self,node):
"""后序遍历"""
if node is None:
return
self.postorder(node.lchild)
self.postorder(node.rchild)
print(node.elem, end=" ")
if __name__=="__main__":
tree=Tree()
for i in range(9):
tree.add(i)
tree.breadth_trave()
print(" ")
tree.preorder(tree.root)
print(" ")
tree.inorder(tree.root)
print(" ")
tree.postorder(tree.root)
执行结果:
0
1
2
3
4
5
6
7
8
0 1 3 7 8 4 2 5 6
7 3 8 1 4 0 5 2 6
7 8 3 4 1 5 6 2 0
课时60由遍历确定一颗二叉树
只要有一个中序遍历,那么加上其他一个遍历就能确定一颗树。
因为中序,根是一定在中间的位置上的。只需要其他一个便利确定左右即可。
假设给定先序和中序。那么通过先序可知,根为0.
那么通过中序可以知道,【738194】一定是一颗树的左半部分。
那么同时又可以根据【738194】把先序给分成三部分。
因为不管则呢么样,【738194】一定是在一起的。
通过过这样,又找到了一个根【0】.
由于1的左边是3,那么3就应该是1的左子根。
根据3这个子根,又可以分出7,8两个子根。
接着判断9。
从中序可以得出,既然1是根,那么9就应该是叶节点。同时,4应该是9的根。
那么最后,526也能确定。
那么如何通过后序和中序来确定一颗树呢?
对于后序来说,根在最后的一部分,那么根应该是0
通过根来划分中序。 接着通过划分好的中序的部分来判断后序如何划分。
对于每一个划分的部分,中序一定保持根在中间,后续一定保持根在最后。
所以可以得出。