1、思想:
所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。
-------------------------------------------深度优先遍历的思想如下------------------------------------------
1》.先(根)序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴ 访问根结点;
⑵ 遍历左子树;
⑶ 遍历右子树。
2》.中(根)序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵访问根结点;
⑶遍历右子树。
3》.后(根)序遍历得递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵遍历右子树;
⑶访问根结点。
2、代码演练:
class Node: # 定义树的节点
def __init__(self, data):
self.root = data # 树根节点
self.lchild = None # 左子树
self.rchild = None # 右子树
class Tree: # 定义一棵树
def __init__(self): # 数的根节点
self.root = None
def add(self, data): # 给树添加节点
node = Node(data) # 传入数据构造成节点
if self.root is None: # 判断左子树
self.root = node
return
queue = [self.root] # 构造列表模拟队列
while queue: # 遍历队列
cur = queue.pop(0)
if cur.lchild is None: # 左子树是否有节点
cur.lchild = node
return
else:
queue.append(cur.lchild)
if cur.rchild == None: # 右子树是否有节点
cur.rchild = node
return
else:
queue.append(cur.rchild)
def breadth_travel(self): # 二叉树的广度遍历
if self.root is None: # 判断根节点是否为空
return
queue = [self.root]
while queue:
cur = queue.pop(0)
print(cur.root, sep=' ', end=' ')
if cur.lchild is not None: # 左子树不为空
queue.append(cur.lchild)
if cur.rchild is not None: # 右子树不为空
queue.append(cur.rchild)
def front_travel(self, node): # 深度优先遍历--------》前序遍历
if node is None:
return
print(node.root, end=' ')
self.front_travel(node.lchild)
self.front_travel(node.rchild)
def mid_travel(self,node): # 深度优先遍历 ----------》 中序遍历
if node is None:
return
self.mid_travel(node.lchild)
print(node.root,end=' ')
self.mid_travel(node.rchild)
def end_travel(self,node): # 深度优先遍历------------》 后序遍历
if node is None:
return
self.end_travel(node.lchild)
self.end_travel(node.rchild)
print(node.root, end=' ')
if __name__ == '__main__':
t = Tree()
for i in range(10):
t.add(i)
t.breadth_travel()
print()
t.front_travel(t.root)
print()
t.mid_travel(t.root)
print()
t.end_travel(t.root)
3、总结:
遍历过程中用到了递归思想,树的构造添加元素,遍历广度优先遍历和深度优先遍历,其中深度优先遍历有三种,
1)、前序遍历:根---左---右
2)、中序遍历:左---根---右
3)、后续遍历:左---右---根