Python实现重建二叉树的三种方法详解


Posted in Python onJune 23, 2018

本文实例讲述了Python实现重建二叉树的三种方法。分享给大家供大家参考,具体如下:

学习算法中,探寻重建二叉树的方法:

  • 用input 前序遍历顺序输入字符重建
  • 前序遍历顺序字符串递归解析重建
  • 前序遍历顺序字符串堆栈解析重建

如果懒得去看后面的内容,可以直接点击此处本站下载完整实例代码

思路

学习算法中,python 算法方面的资料相对较少,二叉树解析重建更少,只能摸着石头过河。

通过不同方式遍历二叉树,可以得出不同节点的排序。那么,在已知节点排序的前提下,通过某种遍历方式,可以将排序进行解析,从而构建二叉树。

应用上来将,可以用来解析多项式、可以解析网页、xml等。

本文采用前序遍历方式的排列,对已知字符串进行解析,并生成二叉树。新手,以解题为目的,暂未优化,未能体现 Python 简洁、优美。请大牛不吝指正。

首先采用 input 输入

节点类

class treeNode:
 def __init__(self, rootObj = None, leftChild = None, rightChild = None):
  self.key = rootObj
  self.leftChild = None
  self.rightChild = None

input 方法重建二叉树

def createTreeByInput(self, root):
  tmpKey = raw_input("please input a key, input '#' for Null")
  if tmpKey == '#':
   root = None
  else:
   root = treeNode(rootObj=tmpKey)
   root.leftChild = self.createTreeByInput(root.leftChild)
   root.rightChild = self.createTreeByInput(root.rightChild)
  return root

以下两种方法,使用预先编好的字符串,通过 list 方法转换为 list 传入进行解析

myTree 为实例化一个空树

调用递归方法重建二叉树

treeElementList = '124#8##5##369###7##'
 myTree = myTree.createTreeByListWithRecursion(list(treeElementList))
 printBTree(myTree, 0)

递归方法重建二叉树

def createTreeByListWithRecursion(self, preOrderList):
  """
  根据前序列表重建二叉树
  :param preOrder: 输入前序列表
  :return: 二叉树
  """
  preOrder = preOrderList
  if preOrder is None or len(preOrder) <= 0:
   return None
  currentItem = preOrder.pop(0) # 模拟C语言指针移动
  if currentItem is '#':
   root = None
  else:
   root = treeNode(currentItem)
   root.leftChild = self.createTreeByListWithRecursion(preOrder)
   root.rightChild = self.createTreeByListWithRecursion(preOrder)
  return root

调用堆栈方法重建二叉树

treeElementList = '124#8##5##369###7##'
 myTree = myTree.createTreeByListWithStack(list(treeElementList))
 printBTree(myTree, 0)

使用堆栈重建二叉树

def createTreeByListWithStack(self, preOrderList):
 """
 根据前序列表重建二叉树
 :param preOrder: 输入前序列表
 :return: 二叉树
 """
 preOrder = preOrderList
 pStack = SStack()
 # check
 if preOrder is None or len(preOrder) <= 0 or preOrder[0] is '#':
  return None
 # get the root
 tmpItem = preOrder.pop(0)
 root = treeNode(tmpItem)
 # push root
 pStack.push(root)
 currentRoot = root
 while preOrder:
  # get another item
  tmpItem = preOrder.pop(0)
  # has child
  if tmpItem is not '#':
   # does not has left child, insert one
   if currentRoot.leftChild is None:
    currentRoot = self.insertLeft(currentRoot, tmpItem)
    pStack.push(currentRoot.leftChild)
    currentRoot = currentRoot.leftChild
   # otherwise insert right child
   elif currentRoot.rightChild is None:
    currentRoot = self.insertRight(currentRoot, tmpItem)
    pStack.push(currentRoot.rightChild)
    currentRoot = currentRoot.rightChild
  # one child is null
  else:
   # if has no left child
   if currentRoot.leftChild is None:
    currentRoot.leftChild = None
    # get another item fill right child
    tmpItem = preOrder.pop(0)
    # has right child
    if tmpItem is not '#':
     currentRoot = self.insertRight(currentRoot, tmpItem)
     pStack.push(currentRoot.rightChild)
     currentRoot = currentRoot.rightChild
    # right child is null
    else:
     currentRoot.rightChild = None
     # pop itself
     parent = pStack.pop()
     # pos parent
     if not pStack.is_empty():
      parent = pStack.pop()
     # parent become current root
     currentRoot = parent
     # return from right child, so the parent has right child, go to parent's parent
     if currentRoot.rightChild is not None:
      if not pStack.is_empty():
       parent = pStack.pop()
       currentRoot = parent
   # there is a leftchild ,fill right child with null and return to parent
   else:
    currentRoot.rightChild = None
    # pop itself
    parent = pStack.pop()
    if not pStack.is_empty():
     parent = pStack.pop()
    currentRoot = parent
 return root

显示二叉树

def printBTree(bt, depth):
 '''''
 递归打印这棵二叉树,#号表示该节点为NULL
 '''
 ch = bt.key if bt else '#'
 if depth > 0:
  print '%s%s%s' % ((depth - 1) * ' ', '--', ch)
 else:
  print ch
 if not bt:
  return
 printBTree(bt.leftChild, depth + 1)
 printBTree(bt.rightChild, depth + 1)

打印二叉树的代码,采用某仁兄代码,在此感谢。

input 输入及显示二叉树结果

 Python实现重建二叉树的三种方法详解

解析字符串的结果

 Python实现重建二叉树的三种方法详解

完整代码参见:https://github.com/flyhawksz/study-algorithms/blob/master/Class_BinaryTree2.py

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

Python 相关文章推荐
Python map和reduce函数用法示例
Feb 26 Python
Python使用metaclass实现Singleton模式的方法
May 05 Python
python 开发的三种运行模式详细介绍
Jan 18 Python
windows下python安装小白入门教程
Sep 18 Python
python 实现对文件夹中的图像连续重命名方法
Oct 25 Python
Python实现定期检查源目录与备份目录的差异并进行备份功能示例
Feb 27 Python
Pandas中Series和DataFrame的索引实现
Jun 27 Python
Python为何不能用可变对象作为默认参数的值
Jul 01 Python
Python中的延迟绑定原理详解
Oct 11 Python
Python Gluon参数和模块命名操作教程
Dec 18 Python
python接口自动化之ConfigParser配置文件的使用详解
Aug 03 Python
python语言实现贪吃蛇游戏
Nov 13 Python
Python根据已知邻接矩阵绘制无向图操作示例
Jun 23 #Python
Python实现的绘制三维双螺旋线图形功能示例
Jun 23 #Python
python和shell监控linux服务器的详细代码
Jun 22 #Python
python中plot实现即时数据动态显示方法
Jun 22 #Python
Python+selenium 获取一组元素属性值的实例
Jun 22 #Python
python selenium 获取标签的属性值、内容、状态方法
Jun 22 #Python
python+selenium打印当前页面的titl和url方法
Jun 22 #Python
You might like
星际争霸中的热键
2020/03/04 星际争霸
PHP获取文件夹内文件数的方法
2015/03/12 PHP
详解PHP的Yii框架中自带的前端资源包的使用
2016/03/31 PHP
PHP实现的DES加密解密类定义与用法示例
2020/11/02 PHP
javascript 尚未实现错误解决办法
2008/11/27 Javascript
js的2种继承方式详解
2014/03/04 Javascript
使用JavaScript刷新网页的方法
2015/06/04 Javascript
JavaScript 基础函数_深入剖析变量和作用域
2016/05/18 Javascript
JS实现保留n位小数的四舍五入问题示例
2016/08/03 Javascript
nodeJs链接Mysql做增删改查的简单操作
2017/02/04 NodeJs
vue实现单选和多选功能
2017/08/11 Javascript
vue动态路由实现多级嵌套面包屑的思路与方法
2017/08/16 Javascript
vue中axios请求的封装实例代码
2019/03/23 Javascript
layui自定义ajax左侧三级菜单
2019/07/26 Javascript
微信小程序云开发如何实现数据库自动备份实现
2019/08/16 Javascript
Vue自定义组件双向绑定实现原理及方法详解
2020/09/03 Javascript
如何在JavaScript中正确处理变量
2020/12/25 Javascript
Python实现的简单发送邮件脚本分享
2014/11/07 Python
基于Python实现签到脚本过程解析
2019/10/25 Python
使用Python的networkx绘制精美网络图教程
2019/11/21 Python
python无序链表删除重复项的方法
2020/01/17 Python
python安装dlib库报错问题及解决方法
2020/03/16 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
2020/04/21 Python
基于Python实现2种反转链表方法代码实例
2020/07/06 Python
美国肌肉和力量商店:Muscle & Strength
2019/06/22 全球购物
医院护理人员的自我评价分享
2013/10/04 职场文书
竞聘演讲稿范文
2014/01/12 职场文书
幼儿园数学教学反思
2014/02/02 职场文书
2014国培学习感言
2014/03/05 职场文书
《月球之谜》教学反思
2014/04/10 职场文书
小学优秀班主任材料
2014/12/17 职场文书
2014年小班保育员工作总结
2014/12/23 职场文书
小班下学期幼儿评语
2014/12/30 职场文书
2015年网络舆情工作总结
2015/07/24 职场文书
2015秋季田径运动会广播稿
2015/08/19 职场文书
2016年清明节寄语
2015/12/04 职场文书