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实现带声音的摩斯码翻译实现方法
May 20 Python
浅谈Python中的闭包
Jul 08 Python
在PyCharm导航区中打开多个Project的关闭方法
Jan 17 Python
在Python文件中指定Python解释器的方法
Feb 18 Python
Python弹出输入框并获取输入值的实例
Jun 18 Python
PyQt5 窗口切换与自定义对话框的实例
Jun 20 Python
Python实现剪刀石头布小游戏(与电脑对战)
Dec 31 Python
Tensorflow轻松实现XOR运算的方式
Feb 03 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
Sep 29 Python
Python爬虫入门教程01之爬取豆瓣Top电影
Jan 24 Python
python包的导入方式总结
Mar 02 Python
python 常用的异步框架汇总整理
Jun 18 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
ThinkPHP3.1的Widget新用法
2014/06/19 PHP
PHP将Excel导入数据库及数据库数据导出至Excel的方法
2015/06/24 PHP
WordPress中给文章添加自定义字段及后台编辑功能区域
2015/12/19 PHP
Yii2实现ajax上传图片插件用法
2016/04/28 PHP
JScript中的undefined和&quot;undefined&quot;的区别
2007/03/08 Javascript
jquery提升性能最佳实践小结
2010/12/06 Javascript
javascript实现跳转菜单的具体方法
2013/07/05 Javascript
JS中判断null、undefined与NaN的方法
2014/03/26 Javascript
jQuery中prev()方法用法实例
2015/01/08 Javascript
js实现YouKu的漂亮搜索框效果
2015/08/19 Javascript
JavaScript+html5 canvas制作的圆中圆效果实例
2016/01/27 Javascript
Vue.js学习教程之列表渲染详解
2017/05/17 Javascript
react 父组件与子组件之间的值传递的方法
2017/09/14 Javascript
Angular将填入表单的数据渲染到表格的方法
2017/09/22 Javascript
node.js用fs.rename强制重命名或移动文件夹的方法
2017/12/27 Javascript
修改node.js默认的npm安装目录实例
2018/05/15 Javascript
详解Vue单元测试case写法
2018/05/24 Javascript
JS中实现隐藏部分姓名或者电话号码的代码
2018/07/17 Javascript
JQuery事件委托(适用于给动态生成的脚本元素添加事件)
2020/02/01 jQuery
JS实现滑动拼图验证功能完整示例
2020/03/29 Javascript
vue 中使用print.js导出pdf操作
2020/11/13 Javascript
[01:13:01]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第三场
2018/04/05 DOTA
[02:28]PWL开团时刻DAY3——Ink Ice与DeMonsTer之间的勾心斗角
2020/11/03 DOTA
python使用递归解决全排列数字示例
2014/02/11 Python
Python中字典(dict)合并的四种方法总结
2017/08/10 Python
PyQt5每天必学之像素图控件QPixmap
2018/04/19 Python
python中的数据结构比较
2019/05/13 Python
python Django 创建应用过程图示详解
2019/07/29 Python
python 比较2张图片的相似度的方法示例
2019/12/18 Python
django创建css文件夹的具体方法
2020/07/31 Python
史上最详细的Python打包成exe文件教程
2021/01/17 Python
理财学专业自荐书
2014/06/28 职场文书
2014年向国旗敬礼活动总结
2014/09/27 职场文书
青年岗位能手事迹材料
2014/12/23 职场文书
运动会三级跳加油稿
2015/07/21 职场文书
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
2022/04/12 MySQL