Python数据结构与算法之二叉树结构定义与遍历方法详解


Posted in Python onDecember 12, 2017

本文实例讲述了Python数据结构与算法之二叉树结构定义与遍历方法。分享给大家供大家参考,具体如下:

先序遍历,中序遍历,后序遍历 ,区别在于三条核心语句的位置

层序遍历  采用队列的遍历操作第一次访问根,在访问根的左孩子,接着访问根的有孩子,然后下一层 自左向右一一访问同层的结点

# 先序遍历
# 访问结点,遍历左子树,如果左子树为空,则遍历右子树,
# 如果右子树为空,则向上走到一个可以向右走的结点,继续该过程
preorder(t):
  if t:
    print t.value
    preorder t.L
    preorder t.R
# 中序遍历
# 从根开始,一直走向左下方,直到无结点可以走则停下,访问该节点
# 然后走向右下方到结点,继续走向左下方:如果结点无右孩子,则向上走回父亲结点
inorder(t):
  inorder(t.L)
  print t.value
  inorder(t.R)
# 后序遍历
inorder(t):
  inorder(t.L)
  inorder(t.R)
  print t.value
# 二叉树结点类型
class BTNode:
  def __init__(self,value,lft=None,rgt=None):
    self.value = value
    self.lft = lft     # 结点左分支 BTNode
    self.rgt = rgt     # 结点右分支 BTNode

为了方便起见,定义一些打印操作

class BinTree():
  def __init__(self):
    self.root = None  # 创建一个空的二叉树
  def isEmpty(self):   # 判断二叉树是否为空
    if self.root is None: return True
    else: return False
  def makeBT(self,bt,L=None,R=None):    # 从当前结点创建二叉树
    bt.lft = L
    bt.rgt = R
  def returnBTdict(self):       # 返回二叉树的字典模式
    if self.isEmpty(): 
      return None
    def rec(bt=None,R=True):
      if R==True:
        bt = self.root
        return {'root':{'value':bt.value,"L":rec(bt.lft,False),
                        "R":rec(bt.rgt,False)} }
      else:
        if bt==None:
          return None
        else:
          return {"value":bt.value,
              "L":rec(bt.lft,False) if bt.lft != None else None,
              "R":rec(bt.rgt,False) if bt.rgt != None else None}
      return None
    return rec()
  def __repr__(self):       # 将二叉树结构打印为字典结构
    return str(self.returnBTdict())

下面是各种遍历方法,添加到树的类中

def printT_VLR(self,bt=None,rec_count = 0):   # 输出二叉树结构(先序遍历)
    # rec_count 用于计算递归深度 以便输出最后的换行符
    """
    # 先序遍历
    # 访问结点,遍历左子树,如果左子树为空,则遍历右子树,
    # 如果右子树为空,则向上走到一个可以向右走的结点,继续该过程
    preorder(t):
      if t:
        print t.value
        preorder t.L
        preorder t.R
    """
    if bt==None: 
      bt = self.root
      print bt.value,
    btL, btR = bt.lft, bt.rgt
    if btL != None:
      print btL.value,;  rec_count += 1;   self.printT_VLR(btL,rec_count);   rec_count -= 1
    if btR != None:
      print btR.value,;  rec_count += 1;   self.printT_VLR(btR,rec_count);   rec_count -= 1
    if rec_count == 0:
      print "\n"
def printT_LVR(self,bt=None):
    """
    # 中序遍历
    # 从根开始,一直走向左下方,直到无结点可以走则停下,访问该节点
    # 然后走向右下方到结点,继续走向左下方:如果结点无右孩子,则向上走回父亲结点
    inorder(t):
      inorder(t.L)
      print t.value
      inorder(t.R)
    """
    if bt==None:
      bt = self.root
    btL, btR = bt.lft, bt.rgt
    if btL != None:
      self.printT_LVR(btL)
    print bt.value,
    if btR != None:
      self.printT_LVR(btR)
def printT_LRV(self,bt=None):
    """
    # 后序遍历
    inorder(t):
      inorder(t.L)
      inorder(t.R)
      print t.value
    """
    if bt==None:
      bt = self.root
    btL, btR = bt.lft, bt.rgt
    if btL != None:
      self.printT_LRV(btL)
    if btR != None:
      self.printT_LRV(btR)
    print bt.value,
def printT_levelorder(self):
    """
    层序遍历 采用队列的遍历操作
    第一次访问根,在访问根的左孩子,接着访问根的有孩子,然后下一层
    自左向右一一访问同层的结点
    """
    btdict = self.returnBTdict()
    q = []
    q.append(btdict['root'])
    while q:
      tn = q.pop(0)  # 从队列中弹出一个结点(也是一个字典)
      print tn["value"],
      if tn["L"]!=None:
        q.append(tn["L"])
      if tn["R"]!=None:
        q.append(tn["R"])

测试打印效果

def test():
  bt = BinTree()
#   btns = [BTNode(v) for v in "+*E*D/CAB"]   # 层序输入
#   bt.root = btns[0]
#   bt.makeBT(btns[0], L=btns[1], R=btns[2])
#   bt.makeBT(btns[1], L=btns[3], R=btns[4])
#   bt.makeBT(btns[3], L=btns[5], R=btns[6])
#   bt.makeBT(btns[5], L=btns[7], R=btns[8])
  btns = [BTNode(v) for v in [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]]
  bt.root = btns[0]
  bt.makeBT(btns[0], L=btns[1], R=btns[2])
  bt.makeBT(btns[1], L=btns[3], R=btns[4])
  bt.makeBT(btns[2], L=btns[5], R=btns[6])
  bt.makeBT(btns[3], L=btns[7], R=btns[8])
  bt.makeBT(btns[4], L=btns[9], R=btns[10])
  bt.makeBT(btns[5], L=btns[11], R=btns[12])
  bt.makeBT(btns[6], L=btns[13], R=btns[14])

输出:

{'root': {'R': {'R': {'R': {'R': None, 'L': None, 'value': 15}, 'L': {'R': None, 'L': None, 'value': 14}, 'value': 7}, 'L': {'R': {'R': None, 'L': None, 'value': 13}, 'L': {'R': None, 'L': None, 'value': 12}, 'value': 6}, 'value': 3}, 'L': {'R': {'R': {'R': None, 'L': None, 'value': 11}, 'L': {'R': None, 'L': None, 'value': 10}, 'value': 5}, 'L': {'R': {'R': None, 'L': None, 'value': 9}, 'L': {'R': None, 'L': None, 'value': 8}, 'value': 4}, 'value': 2}, 'value': 1}}

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python实现批量读取word中表格信息的方法
Jul 30 Python
python中os和sys模块的区别与常用方法总结
Nov 14 Python
Python语言描述连续子数组的最大和
Jan 04 Python
tensorflow实现对图片的读取的示例代码
Feb 12 Python
python如何爬取个性签名
Jun 19 Python
python解决字符串倒序输出的问题
Jun 25 Python
python 梯度法求解函数极值的实例
Jul 10 Python
django 通过URL访问上传的文件方法
Jul 28 Python
Python八皇后问题解答过程详解
Jul 29 Python
python opencv把一张图片嵌入(叠加)到另一张图片上的实现代码
Jun 11 Python
python三引号如何输入
Jul 06 Python
python 闭包函数详细介绍
Apr 19 Python
Python数据结构与算法之图的基本实现及迭代器实例详解
Dec 12 #Python
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
Dec 12 #Python
你真的了解Python的random模块吗?
Dec 12 #Python
Python判断两个对象相等的原理
Dec 12 #Python
浅谈Django REST Framework限速
Dec 12 #Python
Django admin美化插件suit使用示例
Dec 12 #Python
Django admin实现图书管理系统菜鸟级教程完整实例
Dec 12 #Python
You might like
15个小时----从修改程序到自己些程序
2006/10/09 PHP
.htaccess文件保护实例讲解
2011/02/06 PHP
如何在symfony中导出为CSV文件中的数据
2011/10/06 PHP
PHP中使用匿名函数操作数据库的例子
2014/11/17 PHP
PHP获取二维数组中某一列的值集合
2015/12/25 PHP
PHP结合Ueditor并修改图片上传路径
2016/10/16 PHP
RR vs IO BO3 第二场2.13
2021/03/10 DOTA
css把超出的部分显示为省略号的方法兼容火狐
2008/07/23 Javascript
实现51Map地图接口(示例代码)
2013/11/22 Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
2014/02/12 Javascript
再探JavaScript作用域
2014/09/24 Javascript
js实现ArrayList功能附实例代码
2014/10/29 Javascript
jQuery采用连缀写法实现的折叠菜单效果
2015/09/18 Javascript
举例讲解JavaScript中将数组元素转换为字符串的方法
2015/10/25 Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
2016/01/19 Javascript
JS冒泡事件与事件捕获实例详解
2016/11/25 Javascript
vue的状态管理模式vuex
2017/11/30 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
2017/12/07 Javascript
简述vue-cli中chainWebpack的使用方法
2019/07/30 Javascript
微信小程序wxml列表渲染原理解析
2019/11/27 Javascript
javascript 原型与原型链的理解及应用实例分析
2020/02/10 Javascript
详解vue beforeEach 死循环问题解决方法
2020/02/25 Javascript
[02:20]DOTA2中文配音宣传片
2013/05/22 DOTA
python 实现插入排序算法
2012/06/05 Python
Python中转换角度为弧度的radians()方法
2015/05/18 Python
关于python的bottle框架跨域请求报错问题的处理方法
2017/03/19 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
2018/05/21 Python
在Django中输出matplotlib生成的图片方法
2018/05/24 Python
Python wxPython库消息对话框MessageDialog用法示例
2018/09/03 Python
python3正则提取字符串里的中文实例
2019/01/31 Python
Python实现字符串匹配的KMP算法
2019/04/04 Python
python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
2020/02/28 Python
快速解释如何使用pandas的inplace参数的使用
2020/07/23 Python
LN-CC英国:伦敦时尚生活的缩影
2019/09/01 全球购物
广告语设计及教案
2014/03/21 职场文书
服务器SVN搭建图文安装过程
2022/06/21 Servers