python 将有序数组转换为二叉树的方法


Posted in Python onMarch 26, 2019

题目:将[0,1,2,3,4,5,6,7,8,9,10]存储到二叉树,原数组有序,转换为二叉排序树。

二叉排序树的特点:当前节点的左子树上的所有节点都小于该节点,右子树上的所有节点都小于该节点。

二叉排序也称为二叉查找树。

我的实现思路:

取有序数组的中间节点作为根节点,将数组分为左右两个部分,对左右两个子数组做相同的操作,递归的实现。

图示:

python 将有序数组转换为二叉树的方法

1

python 将有序数组转换为二叉树的方法

2

python 将有序数组转换为二叉树的方法

3

代码实现:

def array_to_bitree(array):
  #判断arr是否为空
  if len(array)==0:
    return BiTNode(array[0])
  mid=len(array)//2 # 有序数组的中间元素的下标
  #print(mid)
  #start=0 # 数组第一个元素的下标
  #end=-1 # 数组最后一个元素的下标
  if len(array)>0:
    #将中间元素作为二叉树的根
    root=BiTNode(array[mid])
    #如果左边的元素个数不为零,则递归调用函数,生成左子树
    if len(array[:mid])>0:
      root.left_child = arrayToBiTree(array[:mid])
    #如果右边的元素个数不为零,则递归调用函数,生成左子树
    if len(array[mid+1:])>0:
      root.right_child = arrayToBiTree(array[mid+1:])
  return root

我们调用前面写的三种遍历方法看一看,我们构造的树是否正确:

#将[0,1,2,3,4,5,6,7,8,9,10]存储到二叉树
if __name__ == '__main__':
  #先构造一个有序数组、链表
  arr=[]
  for i in range(10):
    arr.append(i)
  print(arr)
  #调用函数
  BT=arrayToBiTree(arr)
  #前序遍历二叉树
  print("前序")
  print_tree_pre_order(BT)
  # 中序遍历二叉树
  print("中序")
  print_tree_mid_order(BT)
  # 后序遍历二叉树
  print("后序")
  print_tree_after_order(BT)

输出:

python 将有序数组转换为二叉树的方法

根据这三种遍历结果可以判断出二叉树的结构,结果和前面的是一样的,代码如下:

#定义二叉树结点类型
class BiTNode:
  """docstring for BiTNode"""
  def __init__(self,arg):
    self.data = arg
    self.left_child = None
    self.right_child = None

#前序遍历
def print_tree_pre_order(root):
  #先判断二叉树是否为空
  #if root.left_child is None and root.right_child is None:
  if root is None:
    return root
  #先根
  print(root.data)
  #再左
  if root.left_child is not None:
    print_tree_pre_order(root.left_child)
  #再右
  if root.right_child is not None:
    print_tree_pre_order(root.right_child)

#中序遍历二叉树
def print_tree_mid_order(root):

  #先判断二叉树是否为空,当左右节点都为空时
  if root is None:
    return
  #中序遍历 左根右
  #遍历左子树
  if root.left_child is not None:
    print_tree_mid_order(root.left_child)
  #遍历根节点
  print(root.data)
  #遍历右子树
  if root.right_child is not None:
    print_tree_mid_order(root.right_child)

#后序遍历
def print_tree_after_order(root):
  #先判断二叉树是否为空
  if root is None:
    return root
  #再左
  if root.left_child is not None:
    print_tree_after_order(root.left_child)
  #再右
  if root.right_child is not None:
    print_tree_after_order(root.right_child)
  #先根
  print(root.data)

def array_to_bitree(array):
  #判断arr是否为空
  if len(array)==0:
    return BiTNode(array[0])
  mid=len(array)//2 # 有序数组的中间元素的下标
  #print(mid)
  #start=0 # 数组第一个元素的下标
  #end=-1 # 数组最后一个元素的下标
  if len(array)>0:
    #将中间元素作为二叉树的根
    root=BiTNode(array[mid])
    #如果左边的元素个数不为零,则递归调用函数,生成左子树
    if len(array[:mid])>0:
      root.left_child = array_to_bitree(array[:mid])
    #如果右边的元素个数不为零,则递归调用函数,生成左子树
    if len(array[mid+1:])>0:
      root.right_child = array_to_bitree(array[mid+1:])
  return root


    

#将[0,1,2,3,4,5,6,7,8,9,10]存储到二叉树
if __name__ == '__main__':
  #先构造一个有序数组、链表
  arr=[]
  for i in range(9):
    arr.append(i)
  print(arr)
  #调用函数
  BT=array_to_bitree(arr)
  #前序遍历二叉树
  print("前序")
  print_tree_pre_order(BT)
  # 中序遍历二叉树
  print("中序")
  print_tree_mid_order(BT)
  # 后序遍历二叉树
  print("后序")
  print_tree_after_order(BT)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
paramiko模块安装和使用(远程登录服务器)
Jan 27 Python
深入理解Python中装饰器的用法
Jun 28 Python
python opencv之SURF算法示例
Feb 24 Python
pandas 获取季度,月度,年度首尾日期的方法
Apr 11 Python
解决python3 urllib 链接中有中文的问题
Jul 16 Python
Windows下Anaconda2安装NLTK教程
Sep 19 Python
Python实现求两个数组交集的方法示例
Feb 23 Python
将labelme格式数据转化为标准的coco数据集格式方式
Feb 17 Python
Python新手学习装饰器
Jun 04 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
Sep 11 Python
pyqt5实现井字棋的示例代码
Dec 07 Python
selenium框架中driver.close()和driver.quit()关闭浏览器
Dec 08 Python
浅谈Python爬虫基本套路
Mar 25 #Python
我用Python抓取了7000 多本电子书案例详解
Mar 25 #Python
详解python:time模块用法
Mar 25 #Python
Python minidom模块用法示例【DOM写入和解析XML】
Mar 25 #Python
Python实例方法、类方法、静态方法的区别与作用详解
Mar 25 #Python
详解Python装饰器
Mar 25 #Python
详解用python自制微信机器人,定时发送天气预报
Mar 25 #Python
You might like
PHP array操作10个小技巧分享
2011/06/23 PHP
PHP递归调用的小技巧讲解
2013/02/19 PHP
php5.3 goto函数介绍和示例
2014/03/21 PHP
PHP常用数组函数介绍
2014/07/28 PHP
php专用数组排序类ArraySortUtil用法实例
2015/04/03 PHP
浅谈PHP匿名函数和闭包
2019/03/08 PHP
prettify 代码高亮着色器google出品
2010/12/28 Javascript
jquery $.trim()方法使用介绍
2014/05/21 Javascript
js插件YprogressBar实现漂亮的进度条效果
2015/04/20 Javascript
js实现图片上传并正常显示
2015/12/19 Javascript
js简单时间比较的方法
2016/08/02 Javascript
JS正则表达式修饰符global(/g)用法分析
2016/12/27 Javascript
JavaScript实现两个select下拉框选项左移右移
2017/03/09 Javascript
详解VueJs前后端分离跨域问题
2017/05/24 Javascript
JS判断两个数组或对象是否相同的方法示例
2019/02/28 Javascript
vue实现修改图片后实时更新
2019/11/14 Javascript
javascript设计模式 ? 代理模式原理与用法实例分析
2020/04/16 Javascript
Python版的文曲星猜数字游戏代码
2013/09/02 Python
DJANGO-ALLAUTH社交用户系统的安装配置
2014/11/18 Python
Python操作MySQL数据库9个实用实例
2015/12/11 Python
bat和python批量重命名文件的实现代码
2016/05/19 Python
简单讲解Python编程中namedtuple类的用法
2016/06/21 Python
Python探索之URL Dispatcher实例详解
2017/10/28 Python
python实现读取excel文件中所有sheet操作示例
2019/08/09 Python
python动态视频下载器的实现方法
2019/09/16 Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
2020/02/17 Python
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
2020/06/08 Python
python中wheel的用法整理
2020/06/15 Python
linux面试相关问题
2013/04/28 面试题
解释下列WebService名词:WSDL、SOAP、UDDI
2012/06/22 面试题
副总经理工作职责
2013/11/28 职场文书
公司中层干部的自我评价分享
2014/03/01 职场文书
优秀管理者事迹材料
2014/05/22 职场文书
学生会招新宣传语
2015/07/13 职场文书
校园之声广播稿
2015/08/18 职场文书
Nginx的rewrite模块详解
2021/03/31 Servers