⭐今天是小年,祝所有人小年快乐!不知道南方习俗如何,今天我们北方人吃饺子。小年,虽可小憩,但还是要努力啊,至少要比昨天强!🌈⭐
问题描述:二叉树有三种遍历方式,先序遍历、中序遍历和后序遍历,其中的“先、中、后”指的是访问结点的顺序。遍历总体思路是将二叉树分成最小的子树,然后按照顺序输出。请编写一个Python程序,实现二叉树的递归遍历(实现先序、中序、后序、层次的遍历)。
1)实现树的结构
程序代码:
class Node():
def __init__(self, data=None):
self._data = data
self._left = None
self._right = None
def set_data(self, data):
self._data = data
def get_data(self):
return self._data
def set_left(self, node):
self._left = node
def get_left(self):
return self._left
def set_right(self, node):
self._right = node
def get_right(self):
return self._right
if __name__ == '__main__':
# 实例化结点
root_node = Node()
# 实例化根节点
root_node.set_data('a')
# 实例化左节点
root_node.set_left('b')
# 实例化右结点
root_node.set_right('c')
print(root_node.get_data(),root_node.get_left(),root_node.get_right())
2)递归遍历方案
程序代码:
# 实现数结构的类,树的结点有三个私有属性:左指针、右指针、自己的值
class Node():
def __init__(self, data=None, left=None, right=None):
self._data = data
self._left = left
self._right = right
# 先序遍历函数,遍历顺序:根、左、右
def pro_order(tree):
if tree == None:
return False
print(tree._data)
pro_order(tree._left)
pro_order(tree._right)
# 中序遍历函数,遍历顺序:左、根、右
def mid_order(tree):
if tree == None:
return False
mid_order(tree._left)
print(tree._data)
mid_order(tree._right)
# 后序遍历函数,遍历顺序:左、右、根
def pos_order(tree):
if tree == None:
return False
pos_order(tree._left)
pos_order(tree._right)
print(tree._data)
# 层次遍历
def row_order(tree):
queue = []
queue.append(tree)
while True:
if queue == []:
break
print(queue[0]._data)
first_tree = queue[0]
if first_tree._left != None:
queue.append(first_tree._left)
if first_tree._right != None:
queue.append(first_tree._right)
queue.remove(first_tree)
if __name__ == '__main__':
tree = Node('A', Node('B', Node('D', Node('H')), Node('E',Node('I'))), Node('C', Node('F'), Node('G')))
print('先序遍历:')
pro_order(tree)
print('中序遍历:')
mid_order(tree)
print('后序遍历:')
pos_order(tree)
程序分析:
上例中所构建的二叉树如下图所示:
![]()
二叉树 1)先序遍历的流程如下:
a 先访问根节点;b 访问左节点;c 访问右节点
完整顺序是:a(b(d(h))(e(i)))(c(f)(g))——abdheicfg;
2)中序遍历的流程如下:
a 先访问左节点;b 访问根节点;c 访问右节点
完整顺序是:((h)d)b((i)e))a((f)c(g))——hdbieafcg
3)后序遍历的流程如下:
a 先访问左节点;b 访问右节点;c 访问根节点
完整顺序是:((hd)(ie)b)(fgc)a——hdiebfgca