Python实现二叉树构造与七种遍历算法详解
本文详细解析Python中二叉树的构造及七种遍历算法。涵盖递归方式的前序、中序、后序遍历,以及基于堆栈和队列的非递归实现。重点对比深度优先与广度优先搜索在树结构中的应用差异,并探讨递归构造树的局限性及队列构建法的优势,提供完整的代码逻辑与实现思路。
本文通过Python代码实例,详细介绍二叉树的构建过程及其多种遍历方法的实现。内容旨在为读者提供清晰的参考与学习素材。
背景介绍:
树作为一种核心数据结构,主要应用于提升查找效率,特别是在需要频繁重复查找的场景中表现优异,例如二叉排序树和FP-树。此外,树结构还可用于优化编码效率,典型的例子包括哈弗曼树。

代码实现:
以下Python代码实现了树的节点构造及多种遍历算法。尽管基础逻辑并不复杂,但此处对代码进行了整理与总结,旨在实现以下功能:
① 二叉树的节点构造 ② 利用递归算法实现先序、中序及后序遍历 ③ 利用堆栈数据结构实现先序、中序及后序遍历 ④ 利用队列数据结构实现层次遍历
#coding=utf-8
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()
self.myQueue = []
def add(self, elem):
"""为树添加节点"""
node = Node(elem)
if self.root.elem == -1: # 如果树是空的,则对根节点赋值
self.root = node
self.myQueue.append(self.root)
else:
treeNode = self.myQueue[0] # 此结点的子树还没有齐。
if treeNode.lchild == None:
treeNode.lchild = node
self.myQueue.append(treeNode.lchild)
else:
treeNode.rchild = node
self.myQueue.append(treeNode.rchild)
self.myQueue.pop(0) # 如果该结点存在右子树,将此结点丢弃。
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,
def front_stack(self, root):
"""利用堆栈实现树的先序遍历"""
if root == None:
return
myStack = []
node = root
while node or myStack:
while node: #从根节点开始,一直找它的左子树
print node.elem,
myStack.append(node)
node = node.lchild
node = myStack.pop() #while结束表示当前节点node为空,即前一个节点没有左子树了
node = node.rchild #开始查看它的右子树
def middle_stack(self, root):
"""利用堆栈实现树的中序遍历"""
if root == None:
return
myStack = []
node = root
while node or myStack:
while node: #从根节点开始,一直找它的左子树
myStack.append(node)
node = node.lchild
node = myStack.pop() #while结束表示当前节点node为空,即前一个节点没有左子树了
print node.elem,
node = node.rchild #开始查看它的右子树
def later_stack(self, root):
"""利用堆栈实现树的后序遍历"""
if root == None:
return
myStack1 = []
myStack2 = []
node = root
myStack1.append(node)
while myStack1: #这个while循环的功能是找出后序遍历的逆序,存在myStack2里面
node = myStack1.pop()
if node.lchild:
myStack1.append(node.lchild)
if node.rchild:
myStack1.append(node.rchild)
myStack2.append(node)
while myStack2: #将myStack2中的元素出栈,即为后序遍历次序
print myStack2.pop().elem,
def level_queue(self, root):
"""利用队列实现树的层次遍历"""
if root == None:
return
myQueue = []
node = root
myQueue.append(node)
while myQueue:
node = myQueue.pop(0)
print node.elem,
if node.lchild != None:
myQueue.append(node.lchild)
if node.rchild != None:
myQueue.append(node.rchild)
if __name__ == '__main__':
"""主函数"""
elems = range(10) #生成十个数据作为树节点
tree = Tree() #新建一个树对象
for elem in elems:
tree.add(elem) #逐个添加树的节点
print '队列实现层次遍历:'
tree.level_queue(tree.root)
print '\n\n递归实现先序遍历:'
tree.front_digui(tree.root)
print '\n递归实现中序遍历:'
tree.middle_digui(tree.root)
print '\n递归实现后序遍历:'
tree.later_digui(tree.root)
print '\n\n堆栈实现先序遍历:'
tree.front_stack(tree.root)
print '\n堆栈实现中序遍历:'
tree.middle_stack(tree.root)
print '\n堆栈实现后序遍历:'
tree.later_stack(tree.root)
核心总结:
树的遍历策略主要分为两类:一是深度优先遍历,涵盖前序、中序和后序;二是广度优先遍历,即层次遍历。在单纯的树结构中,这两者的差异尚不明显;然而,当树扩展为有向图或无向图时,深度优先搜索(DFS)与广度优先搜索(BFS)在执行效率及应用场景上便展现出显著区别。
通常情况下,深度优先遍历多采用递归方式实现,而广度优先遍历则倾向于使用队列。值得注意的是,大多数可通过递归实现的算法,往往也能通过堆栈结构进行转换实现。
关于树的递归构造,虽然理论上存在相关方法,但在实际思考中往往难以直接构建。从逻辑上看,递归思想更接近深度优先算法,而树的物理构造过程本质上更符合广度优先的特征。若强行使用递归构造树,必须设定明确的终止条件(如限制树的深度),否则生成的树结构可能会偏向左侧或右侧的单支树。因此,在实际操作中,使用队列进行树的构造通常更为稳妥和常见。
上述论述可能存在不够严谨或疏漏之处,欢迎读者指正与补充。
如需进一步了解Python相关知识,可参考本站系列教程:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》以及《Python文件与目录操作技巧汇总》。
希望本文提供的代码与解析能对您的Python程序设计工作有所帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













