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使用正则搜索字符串或文件中的浮点数代码实例
Jul 11 Python
Python实现发送email的几种常用方法
Aug 18 Python
python书籍信息爬虫实例
Mar 19 Python
判断python字典中key是否存在的两种方法
Aug 10 Python
python 调试冷知识(小结)
Nov 11 Python
python如果快速判断数字奇数偶数
Nov 13 Python
python默认参数调用方法解析
Feb 09 Python
Python 改变数组类型为uint8的实现
Apr 09 Python
什么是python的必选参数
Jun 21 Python
利于python脚本编写可视化nmap和masscan的方法
Dec 29 Python
Python开发.exe小工具的详细步骤
Jan 27 Python
Python 全局空间和局部空间
Apr 06 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
新的一年,新的期待:DC在2020年的四部动画电影
2020/01/01 欧美动漫
sphinx增量索引的一个问题
2011/06/14 PHP
phpmyadmin提示The mbstring extension is missing的解决方法
2014/12/17 PHP
php基于表单密码验证与HTTP验证用法实例
2015/01/06 PHP
php提交post数组参数实例分析
2015/12/17 PHP
php结合md5的加密解密算法实例
2016/09/30 PHP
PHP ElasticSearch做搜索实例讲解
2020/02/05 PHP
javascript之对系统的toFixed()方法的修正
2007/05/08 Javascript
JS写的数字拼图小游戏代码[学习参考]
2008/10/29 Javascript
jQuery textarea的长度进行验证
2009/05/06 Javascript
JavaScript效率调优经验
2009/06/04 Javascript
jQuery DOM删除节点操作指南
2015/03/03 Javascript
JS日期格式化之javascript Date format
2015/10/01 Javascript
javascript常用函数(2)
2015/11/05 Javascript
详解JavaScript数组和字符串中去除重复值的方法
2016/03/07 Javascript
对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache详解
2016/04/11 Javascript
js实现的在线调色板功能完整实例
2016/12/21 Javascript
jQuery插件Echarts实现的渐变色柱状图
2017/03/23 jQuery
MvcPager分页控件 适用于Bootstrap
2017/06/03 Javascript
表格展示利器 Bootstrap Table实例代码
2017/09/06 Javascript
JS实现的简单表单验证功能示例
2017/10/13 Javascript
AngularJS实现的2048小游戏功能【附源码下载】
2018/01/03 Javascript
在create-react-app中使用sass的方法示例
2018/10/01 Javascript
小程序中手机号识别的示例
2020/12/14 Javascript
python模拟新浪微博登陆功能(新浪微博爬虫)
2013/12/24 Python
Python里disconnect UDP套接字的方法
2015/04/23 Python
Python中Scrapy爬虫图片处理详解
2017/11/29 Python
python 多维切片之冒号和三个点的用法介绍
2018/04/19 Python
pycharm修改文件的默认打开方式的步骤
2019/07/29 Python
python如何实现图片压缩
2020/09/11 Python
西尔斯百货官网:Sears
2016/09/06 全球购物
英国最大的美妆产品在线零售商之一:Beauty Bay
2017/09/29 全球购物
关于青春的演讲稿三分钟
2014/08/22 职场文书
复兴之路纪录片观后感
2015/06/02 职场文书
优秀团员主要事迹材料
2015/11/05 职场文书
高中英语教学反思范文
2016/03/02 职场文书