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中特殊函数集锦
Jul 27 Python
Python基于回溯法子集树模板实现图的遍历功能示例
Sep 05 Python
Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】
Dec 15 Python
Django框架的使用教程路由请求响应的方法
Jul 03 Python
Django框架实现的简单分页功能示例
Dec 04 Python
详解Python进阶之切片的误区与高级用法
Dec 24 Python
pycharm创建一个python包方法图解
Apr 10 Python
Python 根据数据模板创建shapefile的实现
Nov 26 Python
python super函数使用方法详解
Feb 14 Python
matplotlib 三维图表绘制方法简介
Sep 20 Python
Django中的JWT身份验证的实现
May 07 Python
python游戏开发之pygame实现接球小游戏
Apr 22 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
浅析51个PHP处理字符串的函数
2013/08/02 PHP
phpmailer在服务器上不能正常发送邮件的解决办法
2014/07/08 PHP
Yii框架连表查询操作示例
2019/09/06 PHP
IE6-IE9不支持table.innerHTML的解决方法分享
2012/09/14 Javascript
js改变鼠标的形状和样式的方法
2014/03/31 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
javascript DIV实现跟随鼠标移动
2020/03/19 Javascript
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
2016/04/07 Javascript
BootStrap智能表单实战系列(九)表单图片上传的支持
2016/06/13 Javascript
在localStorage中存储对象数组并读取的方法
2016/09/24 Javascript
微信小程序  modal详解及实例代码
2016/11/09 Javascript
JS简单实现点击按钮或文字显示遮罩层的方法
2017/04/27 Javascript
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
2017/08/04 Javascript
vue+element实现打印页面功能
2019/05/20 Javascript
JavaScript HTML DOM元素 节点操作汇总
2019/07/29 Javascript
小程序接口的promise化的实现方法
2019/12/11 Javascript
JavaScript实现移动端带transition动画的轮播效果
2020/03/24 Javascript
Python中生成器和yield语句的用法详解
2015/04/17 Python
python实现拓扑排序的基本教程
2018/03/11 Python
Python实现的多进程和多线程功能示例
2018/05/29 Python
详解Python3.6安装psutil模块和功能简介
2018/05/30 Python
详解Python中的分组函数groupby和itertools)
2018/07/11 Python
python之文件读取一行一行的方法
2018/07/12 Python
使用Python来做一个屏幕录制工具的操作代码
2020/01/18 Python
使用python实现下载我们想听的歌曲,速度超快
2020/07/09 Python
利用django创建一个简易的博客网站的示例
2020/09/29 Python
万得城电器土耳其网站:欧洲第一大电子产品零售商
2016/10/07 全球购物
Nicole Miller官方网站:纽约女装品牌
2019/09/14 全球购物
孝敬父母的演讲稿
2014/05/14 职场文书
竞选班长演讲稿500字
2014/08/22 职场文书
婚前协议书范本
2014/10/27 职场文书
2014年教育培训工作总结
2014/12/08 职场文书
先进事迹材料怎么写
2014/12/30 职场文书
政工师工作总结2015
2015/05/26 职场文书
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis
css3带你实现3D转换效果
2022/02/24 HTML / CSS