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之关于循环的小伎俩
Oct 02 Python
Python的面向对象思想分析
Jan 14 Python
Python yield 使用浅析
May 28 Python
Python的Tornado框架的异步任务与AsyncHTTPClient
Jun 27 Python
Python实现查找匹配项作处理后再替换回去的方法
Jun 10 Python
Python3 中文文件读写方法
Jan 23 Python
使用python脚本实现查询火车票工具
Jul 19 Python
python 链接sqlserver 写接口实例
Mar 11 Python
Jupyter 无法下载文件夹如何实现曲线救国
Apr 22 Python
PyCharm MySQL可视化Database配置过程图解
Jun 09 Python
tensorflow下的图片标准化函数per_image_standardization用法
Jun 30 Python
python前后端自定义分页器
Apr 13 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入门教程之Zend Studio设置与开发实例
2016/09/09 PHP
微信公众平台开发教程⑤ 微信扫码支付模式介绍
2019/04/10 PHP
RSA实现JS前端加密与PHP后端解密功能示例
2019/08/05 PHP
新浪的图片新闻效果
2007/01/13 Javascript
javascript实现的listview效果
2007/04/28 Javascript
才发现的超链接js导致网页中GIF动画停止的解决方法
2007/11/02 Javascript
javascript 面向对象编程 聊聊对象的事
2009/09/17 Javascript
js bind 函数 使用闭包保存执行上下文
2011/12/26 Javascript
javascript编码的几个方法详细介绍
2013/01/06 Javascript
jQuery中 noConflict() 方法使用
2013/04/25 Javascript
取消选中单选框radio的三种方式示例介绍
2013/12/23 Javascript
解决jquery版本冲突的有效方法
2014/09/02 Javascript
jQuery.position()方法获取不到值的安全替换方法
2015/03/13 Javascript
jQuey将序列化对象在前台显示地实现代码(方法总结)
2016/12/13 Javascript
详解如何在react中搭建d3力导向图
2018/01/12 Javascript
JavaScript实现构造json数组的方法分析
2018/08/17 Javascript
浅谈vue加载优化策略
2019/03/19 Javascript
详解50行代码,Node爬虫练手项目
2019/04/22 Javascript
微信小程序实现张图片合成为一张并下载
2019/07/16 Javascript
浅谈python抛出异常、自定义异常, 传递异常
2016/06/20 Python
Python cookbook(数据结构与算法)让字典保持有序的方法
2018/02/18 Python
Python决策树之基于信息增益的特征选择示例
2018/06/25 Python
python实现微信定时每天和女友发送消息
2019/04/29 Python
Python MySQLdb 执行sql语句时的参数传递方式
2020/03/04 Python
Python如何将函数值赋给变量
2020/04/28 Python
sklearn的predict_proba使用说明
2020/06/28 Python
香蕉共和国加拿大官网:Banana Republic加拿大
2018/08/06 全球购物
手工制作的意大利礼服鞋:Ace Marks
2018/12/15 全球购物
时尚孕妇装:HATCH Collection
2019/09/24 全球购物
初中军训感想300字
2014/03/05 职场文书
清明节演讲稿
2014/05/27 职场文书
贴吧吧主申请感言
2015/08/03 职场文书
商务英语邮件开头问候语
2015/11/10 职场文书
tensorflow+k-means聚类简单实现猫狗图像分类的方法
2021/04/28 Python
springboot 多数据源配置不生效遇到的坑及解决
2021/11/17 Java/Android
vue如何使用模拟的json数据查看效果
2022/03/31 Vue.js