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求解物理学中的双弹簧质能系统详解
Sep 29 Python
python如何压缩新文件到已有ZIP文件
Mar 14 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
May 16 Python
Python计算两个矩形重合面积代码实例
Sep 16 Python
Python之Class&Object用法详解
Dec 25 Python
Python socket聊天脚本代码实例
Jan 02 Python
pytorch之ImageFolder使用详解
Jan 06 Python
Python startswith()和endswith() 方法原理解析
Apr 28 Python
将pymysql获取到的数据类型是tuple转化为pandas方式
May 15 Python
python实现爱奇艺登陆密码RSA加密的方法示例详解
May 27 Python
Python如何定义接口和抽象类
Jul 28 Python
python regex库实例用法总结
Jan 03 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
收音机另类DIY - 纸巾盒做外壳
2021/03/02 无线电
用PHP实现读取和编写XML DOM代码
2010/04/07 PHP
PHP下利用header()函数设置浏览器缓存的代码
2010/09/01 PHP
php比较多维数组中值的大小排序实现代码
2012/09/08 PHP
PDO::errorCode讲解
2019/01/28 PHP
PDO::exec讲解
2019/01/28 PHP
JavaScript 节点操作 以及DOMDocument属性和方法
2007/12/06 Javascript
根据邮箱的域名跳转到相应的登录页面的代码
2012/02/27 Javascript
jQuery实现 注册时选择阅读条款 左右移动
2013/04/11 Javascript
JavaScript中的acos()方法使用详解
2015/06/14 Javascript
jquery过滤特殊字符',防sql注入的实现方法
2016/08/17 Javascript
javascript设计模式Constructor(构造器)模式
2016/08/19 Javascript
js日期相关函数dateAdd,dateDiff,dateFormat等介绍
2016/09/24 Javascript
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
2017/09/21 Javascript
解决VUE框架 导致绑定事件的阻止冒泡失效问题
2018/02/24 Javascript
微信小程序scroll-view仿拼多多横向滑动滚动条
2020/04/21 Javascript
vue单页缓存方案分析及实现
2018/09/25 Javascript
详解webpack4.x之搭建前端开发环境
2019/03/28 Javascript
vue实现随机验证码功能的实例代码
2019/04/30 Javascript
微信小程序实现张图片合成为一张并下载
2019/07/16 Javascript
javascript绘制简单钟表效果
2020/04/07 Javascript
基于JavaScript的数据结构队列动画实现示例解析
2020/08/06 Javascript
通过高德地图API获得某条道路上的所有坐标用于描绘道路的方法
2020/08/24 Javascript
JS数据类型分类及常用判断方法
2020/11/19 Javascript
[01:31]DOTA2上海特级锦标赛 SECRET战队完整宣传片
2016/03/16 DOTA
wxPython中listbox用法实例详解
2015/06/01 Python
Python使用Shelve保存对象方法总结
2019/01/28 Python
python图像处理入门(一)
2019/04/04 Python
tensorflow中tf.reduce_mean函数的使用
2020/04/19 Python
Html5导航栏吸顶方案原理与对比实现
2020/06/10 HTML / CSS
洲际酒店集团美国官网:IHG美国
2017/11/16 全球购物
运动会方队口号
2014/06/07 职场文书
2015年秋季小班开学寄语
2015/05/27 职场文书
心理健康教育主题班会
2015/08/13 职场文书
HAM-2000摩机图
2021/04/22 无线电
Python实现GIF动图以及视频卡通化详解
2021/12/06 Python