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 相关文章推荐
Python利用递归和walk()遍历目录文件的方法示例
Jul 14 Python
hmac模块生成加入了密钥的消息摘要详解
Jan 11 Python
Python3多进程 multiprocessing 模块实例详解
Jun 11 Python
python中reader的next用法
Jul 24 Python
django如何连接已存在数据的数据库
Aug 14 Python
简单了解python PEP的一些知识
Jul 13 Python
python创建ArcGIS shape文件的实现
Dec 06 Python
python机器学习库xgboost的使用
Jan 20 Python
tensorboard实现同时显示训练曲线和测试曲线
Jan 21 Python
Python中断多重循环的几种方式详解
Feb 10 Python
python适合做数据挖掘吗
Jun 16 Python
python自动化发送邮件实例讲解
Jan 04 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
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
2011/04/23 PHP
Thinkphp模板中截取字符串函数简介
2014/06/17 PHP
ThinkPHP中自定义目录结构的设置方法
2014/08/15 PHP
对PHP新手的一些建议(PHP学习经验总结)
2014/08/20 PHP
深入剖析PHP中printf()函数格式化使用
2016/05/23 PHP
如何修改yii2.0自带的user表为其它的表
2017/08/01 PHP
Laravel框架搜索分页功能示例
2019/02/01 PHP
laravel5.1框架基础之Blade模板继承简单使用方法分析
2019/09/05 PHP
jquery 防止表单重复提交代码
2010/01/21 Javascript
js下利用控制器载入对应脚本
2010/07/17 Javascript
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
基于jquery实现的上传图片及图片大小验证、图片预览效果代码
2011/04/12 Javascript
Js获取数组最大和最小值示例代码
2013/10/29 Javascript
javascript使用appendChild追加节点实例
2015/01/12 Javascript
在JavaScript中处理时间之setMinutes()方法的使用
2015/06/11 Javascript
JS实现新浪博客左侧的Blog管理菜单效果代码
2015/10/22 Javascript
js实现文件上传表单域美化特效
2015/11/02 Javascript
JavaScript学习笔记之检测客户端类型是(引擎、浏览器、平台、操作系统、移动设备)
2015/12/03 Javascript
javascript中的try catch异常捕获机制用法分析
2016/12/14 Javascript
js学习心得_一个简单的动画库封装tween.js
2017/07/14 Javascript
浅谈webpack 自动刷新与解析
2018/04/09 Javascript
JS 使用 window对象的print方法实现分页打印功能
2018/05/16 Javascript
vue项目引入Iconfont图标库的教程图解
2018/10/24 Javascript
新版小程序登录授权的方法
2018/12/12 Javascript
axios携带cookie配置详解(axios+koa)
2018/12/28 Javascript
JavaScript实现数字前补“0”的五种方法示例
2019/01/03 Javascript
移动端吸顶fixbar的解决方案详解
2019/07/17 Javascript
基于Vue 撸一个指令实现拖拽功能
2019/10/09 Javascript
Python中的二维数组实例(list与numpy.array)
2018/04/13 Python
CentOS下Python3的安装及创建虚拟环境的方法
2018/11/28 Python
python元组和字典的内建函数实例详解
2019/10/22 Python
python matplotlib.pyplot.plot()参数用法
2020/04/14 Python
canvas绘制太极图的实现示例
2020/04/29 HTML / CSS
美国排名第一的葡萄酒俱乐部:Firstleaf Wine Club
2020/01/02 全球购物
高中自我鉴定
2013/12/20 职场文书
社区志愿者活动方案
2014/08/18 职场文书