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 list使用示例 list中找连续的数字
Jan 27 Python
python实现dnspod自动更新dns解析的方法
Feb 14 Python
python base64 decode incorrect padding错误解决方法
Jan 08 Python
Python多进程分块读取超大文件的方法
Apr 13 Python
Python编程argparse入门浅析
Feb 07 Python
python中yield的用法详解——最简单,最清晰的解释
Apr 04 Python
python循环输出三角形图案的例子
Nov 22 Python
TensorFlow 显存使用机制详解
Feb 03 Python
PyCharm无法引用自身项目解决方式
Feb 12 Python
细数nn.BCELoss与nn.CrossEntropyLoss的区别
Feb 29 Python
Django admin组件的使用
Oct 24 Python
python调用jenkinsAPI构建jenkins,并传递参数的示例
Dec 09 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实现Ftp用户的在线管理
2012/02/16 PHP
兼容PHP和Java的des加密解密代码分享
2014/06/26 PHP
PHP对象递归引用造成内存泄漏分析
2014/08/28 PHP
PHP 实现类似js中alert() 提示框
2015/03/18 PHP
php提交post数组参数实例分析
2015/12/17 PHP
PHP实现适用于自定义的验证码类
2016/06/15 PHP
浅谈PHP的exec()函数无返回值排查方法(必看)
2017/03/31 PHP
laravel高级的Join语法详解以及使用Join多个条件
2019/10/16 PHP
二级域名转向类
2006/11/09 Javascript
JS图片根据鼠标滚动延时加载的实例代码
2013/07/13 Javascript
JS获取当前日期时间并定时刷新示例
2021/03/04 Javascript
avalonjs制作响应式瀑布流特效
2015/05/06 Javascript
JS实现同一个网页布局滑动门和TAB选项卡实例
2015/09/23 Javascript
JavaScript中的return语句简单介绍
2015/12/07 Javascript
JavaScript中的原型继承基础学习教程
2016/05/06 Javascript
js 判断附件后缀的简单实现方法
2016/10/11 Javascript
JavaScript中双向数据绑定详解
2017/05/03 Javascript
浅谈vue-lazyload实现的详细过程
2017/08/22 Javascript
vue.js项目打包上线的图文教程
2017/11/16 Javascript
基于 flexible 的 Vue 组件:Toast -- 显示框效果
2017/12/26 Javascript
vue基础之使用get、post、jsonp实现交互功能示例
2019/03/12 Javascript
基于layui的table插件进行复选框联动功能的实现方法
2019/09/19 Javascript
JavaScript实现简单随机点名器
2019/11/21 Javascript
深入学习Python中的装饰器使用
2016/06/20 Python
Python 内置函数complex详解
2016/10/23 Python
tensorflow学习笔记之mnist的卷积神经网络实例
2018/04/15 Python
python保存二维数组到txt文件中的方法
2018/11/15 Python
python反编译学习之字节码详解
2019/05/19 Python
HTML5中input输入框默认提示文字向左向右移动的示例代码
2020/09/10 HTML / CSS
Sneaker Studio匈牙利:购买运动鞋
2018/03/26 全球购物
沙特阿拉伯家用电器和电子产品购物网站:Sheta and Saif
2020/04/03 全球购物
在什么时候需要使用"常引用"
2015/12/31 面试题
合同协议书格式
2014/04/18 职场文书
分居协议书范本(律师见证版)
2014/11/26 职场文书
销售合作意向书范本
2015/05/08 职场文书
导游词之澳门玫瑰圣母堂
2019/12/03 职场文书