Python实现二叉树构造与七种遍历算法详解

听雨眠
听雨眠
发布时间:2026-10-13| 1人浏览过
原创

本文详细解析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程序设计工作有所帮助。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。