树是数据结构中非常重要的一种,主要的用途是用来提高查找效率,对于要重复查找的情况效果更佳,如二叉排序树、FP-树。另外可以用来提高编码效率,如哈弗曼树。树的遍历主要有两种,一种是深度优先遍历,像前序、中序、后序;另一种是广度优先遍历,像层次遍历。在树结构中两者的区别还不是非常明显,但从树扩展到有向图,到无向图的时候,深度优先搜索和广度优先搜索的效率和作用就会有很大的不同。
class Node(object):
""" 二叉树里的节点类 """
def __init__(self, elem=-1, lchild=None, rchild=None):
self.elem = elem
self.lchild = lchild
self.rchild = rchild
class Tree(object):
""" 树类 """
def __init__(self):
self.root = Node() #根节点初始化为 elem=-1
def add(self, elem):
""" 为树添加节点 """
node = Node(elem) # Node(0)
if self.root.elem == -1: #首先判断 如果树是空的,则对根节点赋值
self.root = node
else: # 如果树不是空的
myQueue = []
treeNode = self.root
myQueue.append(treeNode)
while myQueue: #已有的树 一层一层的来
treeNode = myQueue.pop(0) # pop出来第一个成员 Queue列成员少一个
if treeNode.lchild == None:
treeNode.lchild = node
return
elif treeNode.rchild == None: #如果左子为空则赋给左子 否则给右子
treeNode.rchild = node
return
else: #如果都不为空
myQueue.append(treeNode.lchild) #将左右子全部加入到myQueue列中 子树的子树 递归调用的思想
myQueue.append(treeNode.rchild)
def front_digui(self, root):
""" 利用递归实现树的先序遍历 """
if root == None:
return
print root.elem
self.front_digui(root.lchild)
self.front_digui(root.rchild) # 根,左,右
def middle_digui(self, root):
""" 利用递归实现树的中序遍历 """
if root == None:
return
self.middle_digui(root.lchild)
print root.elem
self.middle_digui(root.rchild) # 左,根,右
def later_digui(self, root):
""" 利用递归实现树的后序遍历 """
if root == None:
return
self.later_digui(root.lchild)
self.later_digui(root.rchild)
print root.elem #左,右,根
if __name__ == '__main__':
""" 主函数 """
elems = range(10) #生成十个数据作为树节点
tree = Tree() #新建一个树对象
for elem in elems:
tree.add(elem) #逐个添加树的节点
print '\n\n递归实现先序遍历:'
tree.front_digui(tree.root)
print '\n递归实现中序遍历:'
tree.middle_digui(tree.root)
print '\n递归实现后序遍历:'
tree.later_digui(tree.root)
递归实现先序遍历:
0
1
3
7
8
4
9
2
5
6
递归实现中序遍历:
7
3
8
1
9
4
0
5
2
6
递归实现后序遍历:
7
8
3
9
4
1
5
6
2
0