参考书籍:《算法之美——Python语言实现》
学习Python算法的同学极力推荐此书

前言:正在准备蓝桥杯的博主,为了防止爆零,打算学习如何构建叉树。废话不多说了,回到正题。

目录

  • 一:使用Python去构建一个最简单的叉树
  • 二:二叉树的遍历算法
    • A:先序遍历
    • B:中序遍历
    • C:后序遍历
    • D:分层遍历
  • 三:附录
    • A:树的深度
    • B:建树解释
    • C:isinstance(a,b)

一:使用Python去构建一个最简单的叉树

最简单的叉树自然为二叉树。那么如何构建一个这样的二叉树呢?

定义节点:
代码如下:

class TreeNode():def __init__(self,data=""):self.data=dataself.left=Noneself.right=Nonedef __init__(self):return str(self.data)

代码解释:
定义一个节点的类,定义两个特殊方法。第一个特殊方法:默认data值为空字串,等待接收的值,同时左右子节点为空。第二个特殊方法:是为隐性读取当前子节点方法,并且返回当前节点值。

开始建树:
代码如下:

class BuildTree():def __init__(self,firstData):self.rootNode=Node(firstData)def addNodes(self,NewDatas):Datalength=len(NewDatas)+1depth=np.floor(np.log2(Datalength))+1i=2stock=[self.rootNode]while i<=depth:currNN=2**(i-1)j=0while j<currNN:curr=stock[0]j+=1if NewDatas:data=NewDatas.pop(0)else:breakNode1=Node(data)print("入节点数%d"%(data))if j%2==0:curr.right=Node1stock.pop(0)stock.append(Node1)else:curr.left=Node1stock.append(Node1)i+=1

代码解释:
定义一个建树的类。该类一个特殊方法:创建根的节点,默认数据为空(如果不想让默认的数据为空,则去更改定义节点类的第一个的特殊方法)。该类的第二个方法(注意要去导入numpy库改名为np,蓝桥杯赛场上不会安装numpy库,这里可以改动变为math库,是一样的):这个方法接收一个列表(排序好的)。开始执行函数语句:记录数据长度(+1是因为根节点),记录树的深度(+1是因为根节点)(读者可以自行思考深度公式或者去看文章附录(狗头保命)),令i=2(因为第一层为根节点为空值),创建一个列表记录根节点地址。开始循环:当i大于深度,跳出循环。对于每次循环记录当前深度最大节点(它这个变量名不好看)。令j=0,开始嵌套循环,首先记录当前节点地址,列表不为空时,记录列表第一元素并且删除,当列表为空时,结束嵌套循环。对于每个元素都会生成一个节点,如果j%2==0,则为右节点,否则为左节点(这里有个删除添加地址问题,不好表述,读者可以自行领会,挺简单的,或者去看文章附录)。

给出数据与执行程序:
代码如下:

line1=[1,20,30,40,50,60,70,80]
B1=BuildTree(line1[0])
B1.addNodes(line1[1:])

代码输出:

入节点数20
入节点数30
入节点数40
入节点数50
入节点数60
入节点数70
入节点数80

代码解释:
这样执行程序可以让根节点不为空值。

学习心得(我认为还是挺重要):
对于构建叉树,这个算法是我目前找到最好的算法了。有使用递归函数构建叉树的代码,但是递归方法只能先序构建叉树(我认为并不好),而且对输入有要求(给定的数据中必须包含特定符号结束递归),具体可以参考这篇文章递归构建叉树。比赛中如果没有特定字符结束递归,就很难受(狗头保命)。

二叉树的构建就这样吧,非二叉树也超过了博主临时抱佛脚的范畴。接下,讲讲二叉树的遍历吧!

二:二叉树的遍历算法

A:先序遍历

代码如下:

def preoder(root):p1=[]if root:p1.append(root.data)p1+=preoder(root.left)p1+=preoder(root.right)return p1
L1=preoder(B1.rootNode)
print(L1)

代码输出:

[1, 20, 40, 80, 50, 30, 60, 70]

代码解释:
这里其实就是两个递归函数。如果了解递归函数运行机制理解起来是十分容易的。如果读者仍然不很了解递归函数可以观看我的另外两篇文章:一、Python:递归函数(基础)二、Python:递归函数(深入)

B:中序遍历

代码如下:

def middle(root):p1=[]if root:p1+=middle(root.left)p1.append(root.data)p1+=middle(root.right)return p1
L1=middle(B1.rootNode)
print(L1)

代码输出:

[80, 40, 20, 50, 1, 60, 30, 70]

代码解释:
同样也是调用递归函数

C:后序遍历

代码如下:

def post(root):p1=[]if root:p1+=post(root.left)p1+=post(root.right)p1.append(root.data)return p1
L1=post(B1.rootNode)
print(L1)

代码输出:

[80, 40, 50, 20, 60, 70, 30, 1]

代码解释:
原书作者没有打印函数,但是问题不大。然后这里也是递归,没有什么好解释的。

D:分层遍历

代码如下:

def level(root):q1=[root.data,root.left,root.right]p1=[]while q1:em=q1.pop(0)if em:if isinstance(em,Node):q1.append(em.data)q1.append(em.left)q1.append(em.right)else:p1.append(em)return p1
L1=level(B1.rootNode)
print(L1)

代码输出:

[1, 20, 30, 40, 50, 60, 70, 80]

代码解释:
创建一个列表q1存放数据(左右节点地址) p1同样记录节点数值。进行循环,删除q1中的第一个元素即节点数据,同时记录该数据。如果节点不是空值,判断元素是否为节点的地址,如果不是存放节点数据进入列表;如果就是把节点的数据,把左右子节点地址放入列表。接着进行下一次的循环(具体可以去看附录)。

三:附录

A:树的深度

注释:对第n层,按照上述建树方法。每一个元素前面元素的个数包括自身必然大于
[pow(2,n-1))-1],小于[pow(2,n)],取对数后再加上1,即得到深度

B:建树解释

在建树时,先建立左子节点,并且将左节点地址存入列表。再建立右子节点,最重要的就是删除节点地址。说白了就是栈进与栈出。如果实在没有办法理解就用VScode一步一步的运行吧。

C:isinstance(a,b)

个人理解就是type(a)呢是否与b相等。例如instance(2.0,float)返回True。

>>> isinstance(2.0,float)
True

好了,以上就是本次文章的全部内容了,如果认为有用或者喜欢的话那就点个赞吧,感谢屏幕前那认真看完的你

好累,我也要睡觉了,yeah!

Python:数据结构——构建叉树相关推荐

  1. python数据结构基础(单链表,多链表,二叉树)

    python数据结构基础(单链表,多链表,二叉树) 数据结构指数据对象中数据元素之间的关系 Python 给我们提供了很多现成的数据结构类型,这些系统自己定义好的,不需要我们自己去定义的数据结构叫做 ...

  2. python数据结构包括什么_Python中的数据结构详解

    概述 在深入研究数据科学和模型构建之前,Python中的数据结构是一个需要学习的关键内容 了解Python提供的不同数据结构,包括列表.元组等 介绍 数据结构听起来是一个非常直截了当的话题,但许多数据 ...

  3. python数据结构与算法13_python 数据结构与算法 (13)

    python 数据结构与算法 (13) 选择排序 (Selection sort) 是? 种简单直观的排序算法. 它的? 作原理如 下.? 先在未排序序列中找到最?(?)元素, 存放到排序序列的起始位 ...

  4. python数据结构的应用场景不包括,Python 数据结构学习

    Python 数据结构学习 列表 list.append(x) 在列表的末尾添加一个元素.相当于 a[len(a):] = [x] . list.extend(iterable) 使用可迭代对象中的所 ...

  5. 【Python基础入门系列】第07天:Python 数据结构--序列

    python内置序列类型最常见的是列表,元组和字符串.(序列是python中最基础的数据结构,而数据结构是计算机存储,组织数据的方式.) 另外还提供了字典和集合的数据结构,但他们属于无顺序的数据集合体 ...

  6. python 数据结构包括三方面_python数据结构

    python数据结构 背景 之所以选择这个话题,有两方面原因: 很多情况下,有些语句是看到别人这么用,自己就这么用,并不知道为什么要这么用 写了一段代码,很简洁很美观,跑起来比驴还慢 只有知道内部原理 ...

  7. Python数据结构与算法(1.7)——算法分析

    Python数据结构与算法(1.7)--算法分析 0. 学习目标 1. 算法的设计要求 1.1 算法评价的标准 1.2 算法选择的原则 2. 算法效率分析 2.1 大 OOO 表示法 2.2 常见算法 ...

  8. Python数据结构与算法(1.1)——数据结构与算法导论

    Python数据结构与算法(1.1)--数据结构与算法导论 0. 学习目标 1. 数据结构概述 1.1 什么是数据结构 1.2 逻辑结构和物理结构 1.3 抽象数据类型 1.4 数据结构学习的必要性 ...

  9. python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图

    python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...

最新文章

  1. 基于weka实现的神经网络算法实现
  2. Hyper-V的实验安装----1
  3. php m grep event,php-如何杀死与30分钟以上的grep匹配的进程?
  4. 邓白氏编码查询_外贸人常用查询工具汇总
  5. java识别系统_[Java教程]Java识别操作系统
  6. MSComm写串口通信驱动步骤
  7. JDK1.8简单配置环境变量---两步曲
  8. pdf sdk for android,Android 自带PDF SDK
  9. 数据-第12课-线性表课后练习
  10. 蓝牙耳机连接电脑没有声音解决办法
  11. matlab画图命令plot,matlab画图命令plot
  12. 【阿里云镜像】更改阿里巴巴开源镜像站镜像之——CentOS镜像
  13. Play 2.6 异步处理结果
  14. SCI论文的Highlights怎么写(正经的教你怎么写)
  15. JavaScript之封装Math函数
  16. c程序设计语言看第几版,到底该怎样评价谭浩强版《C程序设计》?
  17. 飞思卡尔Kinetis系列单片机被锁住后,怎么解锁
  18. 跨境电商wish账户被禁用暂停的原因有哪些?wish店铺封号注意事项
  19. Office365 - 修改用户密码Teams无法登陆的解决方案
  20. Windows ❀ AD域服务器的搭建(LDAP协议)

热门文章

  1. python写日历程序_利用Python自动化生成逼格高的日历!
  2. 医院计算机系统维护好不好做,医院计算机系统的维护策略探讨.doc
  3. 【数值分析】数值分析研究对象与特点
  4. Kodi皮肤乱码改中文设置-Arctic: Zephyr- Reloaded
  5. 给出一个大于或等于3的正整数,判断它是不是一个素数
  6. java awt 仿360 进度_Android 控件进阶修炼-仿360手机卫士波浪球进度控件
  7. AD19全局替换网络标号
  8. 关于如何设计动态表情的分享
  9. java做windows屏保_java编程加载窗口,制作动画(屏保泡泡)
  10. SQL中Group分组的使用