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 相关文章推荐
zbar解码二维码和条形码示例
Feb 07 Python
Python的GUI框架PySide的安装配置教程
Feb 16 Python
Python中方法链的使用方法
Feb 23 Python
Win8下python3.5.1安装教程
Jul 29 Python
Pycharm无法使用已经安装Selenium的解决方法
Oct 13 Python
python检测文件夹变化,并拷贝有更新的文件到对应目录的方法
Oct 17 Python
python制作填词游戏步骤详解
May 05 Python
3种python调用其他脚本的方法
Jan 06 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
Feb 20 Python
Jupyter notebook快速入门教程(推荐)
May 18 Python
Keras 中Leaky ReLU等高级激活函数的用法
Jul 05 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
Nov 27 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
PHP date函数参数详解
2006/11/27 PHP
mysql 字段类型说明
2007/04/27 PHP
初识laravel5
2015/03/02 PHP
Yii2中SqlDataProvider用法示例
2016/09/22 PHP
thinkPHP5.0框架URL访问方法详解
2017/03/18 PHP
轻轻松松学JS调试(不下载任何工具)
2010/04/14 Javascript
js两行代码按指定格式输出日期时间
2011/10/21 Javascript
AngularJS动态菜单操作指令
2017/04/25 Javascript
在 Angular 中使用Chart.js 和 ng2-charts的示例代码
2017/08/17 Javascript
angular4自定义组件详解
2017/09/28 Javascript
在layui下对元素进行事件绑定的实例
2019/09/06 Javascript
vue实现简单的登录弹出框
2020/10/26 Javascript
js实现弹窗猜数字游戏
2020/11/26 Javascript
[37:03]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第二场 12.16
2020/12/18 DOTA
python使用htmllib分析网页内容的方法
2015/05/08 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
2017/06/12 Python
Python实现的井字棋(Tic Tac Toe)游戏示例
2018/01/31 Python
python将一组数分成每3个一组的实例
2018/11/14 Python
elasticsearch python 查询的两种方法
2019/08/04 Python
使用 Python ssh 远程登陆服务器的最佳方案
2020/03/06 Python
python实现人性化显示金额数字实例详解
2020/09/25 Python
Subside Sports德国:足球球衣和球迷商品
2019/06/08 全球购物
美国亚马逊旗下男装网站:East Dane(支持中文)
2019/09/25 全球购物
法国在线药房:1001Pharmacies
2021/03/07 全球购物
.NET里面什么时候需要调用垃圾回收
2015/06/01 面试题
C# .NET面试题
2015/11/28 面试题
档案接收函范文
2014/01/10 职场文书
汽车队司机先进事迹材料
2014/02/01 职场文书
秋季运动会广播稿大全
2014/02/17 职场文书
《太阳》教学反思
2014/02/21 职场文书
设计顾问服务计划书
2014/05/04 职场文书
工会主席事迹材料
2014/06/03 职场文书
庆六一开幕词
2015/01/29 职场文书
mysql定时自动备份数据库的方法步骤
2021/07/07 MySQL
使用javascript解析二维码的三种方式
2021/11/11 Javascript
详解python的异常捕获
2022/03/03 Python