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使用urllib模块开发的多线程豆瓣小站mp3下载器
Jan 16 Python
python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
Jul 11 Python
简单的Python2.7编程初学经验总结
Apr 01 Python
深入理解Python装饰器
Jul 27 Python
使用Python脚本和ADB命令实现卸载App
Feb 10 Python
Python使用正则表达式过滤或替换HTML标签的方法详解
Sep 25 Python
python3.4.3下逐行读入txt文本并去重的方法
Apr 29 Python
python面向对象实现名片管理系统文件版
Apr 26 Python
Python标准库json模块和pickle模块使用详解
Mar 10 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
Apr 22 Python
使用Python文件读写,自定义分隔符(custom delimiter)
Jul 05 Python
基于Python实现体育彩票选号器功能代码实例
Sep 16 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正则preg_replace_callback函数用法实例
2015/06/01 PHP
教你识别简单的免查杀PHP后门
2015/09/13 PHP
Symfony2中被遗弃的getRequest()方法分析
2016/03/17 PHP
PHP API接口必备之输出json格式数据示例代码
2017/06/27 PHP
javascript function、指针及内置对象
2009/02/19 Javascript
Mootools 1.2教程 Fx.Tween的使用
2009/09/15 Javascript
jquery获取自定义属性(attr和prop)实例介绍
2013/04/21 Javascript
JS实现图片翻书效果示例代码
2013/09/09 Javascript
javascript自然分类法算法实现代码
2013/10/11 Javascript
Jquery对数组的操作技巧整理
2014/03/25 Javascript
同一个网页中实现多个JavaScript特效的方法
2015/02/02 Javascript
关于Jquery中的事件绑定总结
2016/10/26 Javascript
js实现前端分页页码管理
2017/01/06 Javascript
js实现省份下拉菜单效果
2017/02/15 Javascript
layui弹出层效果实现代码
2017/05/19 Javascript
javascript观察者模式实现自动刷新效果
2017/09/05 Javascript
Vue 刷新当前路由的实现代码
2019/09/26 Javascript
在vue中使用回调函数,this调用无效的解决
2020/08/11 Javascript
python同时给两个收件人发送邮件的方法
2015/04/30 Python
python实现的多线程端口扫描功能示例
2017/01/21 Python
教你使用python画一朵花送女朋友
2018/03/29 Python
python读取视频流提取视频帧的两种方法
2020/10/22 Python
django中模板的html自动转意方法
2018/05/27 Python
Python高级特性与几种函数的讲解
2019/03/08 Python
python opencv对图像进行旋转且不裁剪图片的实现方法
2019/07/09 Python
详解Python Qt的窗体开发的基本操作
2019/07/14 Python
python实现复制大量文件功能
2019/08/31 Python
Python使用py2neo操作图数据库neo4j的方法详解
2020/01/13 Python
Python 实现平台类游戏添加跳跃功能
2020/03/27 Python
详解pandas赋值失败问题解决
2020/11/29 Python
应届大专毕业生个人自荐信
2013/09/22 职场文书
青年创业培训欢迎词
2014/01/10 职场文书
2014年内部审计工作总结
2014/12/09 职场文书
2015年话务员工作总结
2015/04/29 职场文书
贷款工作证明模板
2015/06/12 职场文书
python urllib库的使用详解
2021/04/13 Python