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 15 Python
python生成1行四列全2矩阵的方法
Aug 04 Python
python实现归并排序算法
Nov 22 Python
Python网页正文转换语音文件的操作方法
Dec 09 Python
对python以16进制打印字节数组的方法详解
Jan 24 Python
python pygame实现五子棋小游戏
Oct 26 Python
在python中,使用scatter绘制散点图的实例
Jul 03 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
Jul 07 Python
python 字符串追加实例
Jul 20 Python
找Python安装目录,设置环境路径以及在命令行运行python脚本实例
Mar 09 Python
 分享一个Python 遇到数据库超好用的模块
Apr 06 Python
python神经网络 tf.name_scope 和 tf.variable_scope 的区别
May 04 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
网站用php实现paypal整合方法
2010/11/28 PHP
PHP实现单例模式建立数据库连接的方法分析
2020/02/11 PHP
Google韩国首页图标动画效果
2007/08/26 Javascript
ExtJS 学习专题(一) 如何应用ExtJS(附实例)
2010/03/11 Javascript
jquery绑定原理 简单解析与实现代码分享
2011/09/06 Javascript
事件冒泡是什么如何用jquery阻止事件冒泡
2013/03/20 Javascript
ExtJS实现文件下载的方法实例
2013/11/09 Javascript
js无刷新操作table的行和列
2014/03/27 Javascript
Jquery实现Div上下移动示例
2014/04/23 Javascript
JavaScript跨域方法汇总
2014/10/16 Javascript
基于JavaScript FileReader上传图片显示本地链接
2016/05/27 Javascript
Vuejs第十三篇之组件——杂项
2016/09/09 Javascript
基于vue2框架的机器人自动回复mini-project实例代码
2017/06/13 Javascript
使用D3.js制作图表详解
2017/08/13 Javascript
从零开始最小实现react服务器渲染详解
2018/01/26 Javascript
详解JavaScript 中 if / if...else...替换方式
2018/07/15 Javascript
vue实现div拖拽互换位置
2020/07/29 Javascript
jQuery实现的简单日历组件定义与用法示例
2018/12/24 jQuery
layui table 表格上添加日期控件的两种方法
2019/09/28 Javascript
vue项目中常见问题及解决方案(推荐)
2019/10/21 Javascript
nuxt 页面路由配置,主页轮播组件开发操作
2020/11/05 Javascript
[01:56]生活中的妖精之七夕特别档
2016/08/09 DOTA
Python抓取框架 Scrapy的架构
2016/08/12 Python
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
python pycurl验证basic和digest认证的方法
2018/05/02 Python
Python配置虚拟环境图文步骤
2019/05/20 Python
python 类之间的参数传递方式
2019/12/20 Python
Tensorflow轻松实现XOR运算的方式
2020/02/03 Python
10种CSS3实现的loading动画,挑一个走吧?
2020/11/16 HTML / CSS
金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)-> (一千零一拾一元整)输出
2015/05/29 面试题
美发店5.1活动方案
2014/01/24 职场文书
企业理念标语
2014/06/09 职场文书
新闻学专业职业生涯规划范文:我的人生我做主
2014/09/12 职场文书
销售人员工作自我评价
2014/09/21 职场文书
90后经典动画片排行:《数码宝贝》第二,《小鲤鱼历险记》在榜
2022/03/18 日漫
Python实现将多张图片合成MP4视频并加入背景音乐
2022/04/28 Python