赞
踩
树是一种抽象数据类型(ADT)或是视作这种抽象数据类型的数据结构
顺序存储:将数据结构存储在固定的数组中,在遍历速度上有一定的优势,但因所占空间比较大,是非主流二叉树。二叉树通常以链式存储
链式存储:可以存储,但是子节点个数无法掌握,因此通常把多叉树转换为二叉树,子节点个数最多为2
二叉树是每个节点最多有两个子树的树结构,通常子树被称作‘左子树’和‘右子树’
# 定义节点 class Node(object): def __init__(self,item): self.elem=item self.lchild=Node self.rchild=Node # 构建树 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=[] queue.append(self.root) # 先将根节点放入队列中 queue=[self.root] # 每次取出的元素都进行相同的操作,直到队列中无元素 # 这里使用列表的逻辑值判断,若为空返回False,只要有元素就返回True,即使是None 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 breath_travel(self):
"""广度遍历"""
if self.root is None:
return
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)
使用队列添加和遍历元素,所以元素的输出和输入特点是先进先出
测试及结果:
if __name__ == '__main__':
tree=Tree()
tree.add(1)
tree.add(2)
tree.add(3)
tree.add(4)
tree.add(5)
tree.breath_travel()
1
2
3
4
5
深度优先搜索是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。
三种访问树的节点的方式:
def preoder(self,node): """先序遍历:根左右""" if node is None: return print(node.elem,end=' ') self.preoder(node.lchild) self.preoder(node.rchild) def midorder(self,node): """中序遍历,左根右""" if node is None: return self.midorder(node.lchild) print(node.elem, end=' ') self.midorder(node.rchild) def behind(self,node): """后序遍历;左右根""" if node is None: return self.behind(node.lchild) self.behind(node.rchild) print(node.elem,end=' ') if __name__ == '__main__': tree=Tree() tree.add(0) tree.add(1) tree.add(2) tree.add(3) tree.add(4) tree.add(5) tree.add(6) tree.add(7) tree.add(8) tree.add(9) tree.breath_travel() # 由于使用队列添加和遍历元素,所以是先进先出 print(' ') tree.preoder(tree.root) print(' ') tree.midorder(tree.root) print(' ') tree.behind(tree.root) print(' ')
结果:
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
给出遍历序列,确定树的结构
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。