Python算法笔记(3)-树、二叉树、二叉堆、二叉搜索树

news2024/9/24 11:23:06

在这里插入图片描述

树和二叉树

什么是树

树是一种非线性的数据结构,由n个节点构成的有限集合,节点数0的树叫空树,在任意一棵树中,有且仅有一个特点的称为根节点,当N>1时,其余节点可分m为互不相交的有限集。
例如如下:

class Tree:
    def __init__(self, af=0, mid=None, ru=None):
        self.af = af
        self.mid = mid
        self.ru = ru
    


在这里插入图片描述

什么是二叉树

二叉树是树的一种特殊形式,每个节点有两个子节点,最多两个,也有1哥
在这里插入图片描述

class node :
    def __init__(self,ru,su=None,bu=None):
        self.ru =ru
        self.su =su
        self.bu = bu
class tree:
    def __init__(self,rut=None):
        self.rut = rut

二叉树如何用

二叉树主要应用于查找操作和维持相对顺序

二叉查找树

二叉查找树仔二叉树上增加几个条件
1。如果左子树不为空,则右子树上所有的节点的值均小于根节点的值
2。如果右子树不为空,则右子树上所有的节点的值均大于根节点的值
3。左子树,右子树都是二叉查找树
在这里插入图片描述
对于一个节点分布相对均衡的二叉查找树来说,如果节点总数是n,那么搜索节点时间复杂度就是O(logn),和树的深度一样。

二叉树如何遍历

为什么要遍历?

遍历本身是一个线性操作,所以遍历同样具有线性结构的数组和链表是一件轻而易举的事情。
二叉树的遍历分为四种:先序遍历,中序遍历,后序遍历,层序遍历
宏观角度看,二叉树的遍历归类为:1。深度遍历(前序遍历、中序遍历、后序遍历)、广度优先遍历

深度优先遍历

在这里插入图片描述
也可以用binarytree插件来实现

from binarytree import Node

root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.right = Node(6)

print(root)

相关binarytree用法参考这篇文章
在这里插入图片描述
后面print(root.preorder)即可使用先序遍历顺序

在这里插入图片描述

在这里插入图片描述

from binarytree import Node

root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.right = Node(6)

print(root.inorder)#中序遍历

在这里插入图片描述

在这里插入图片描述

from binarytree import Node

root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.right = Node(6)
print(root)
print(root.postorder)

在这里插入图片描述

广度优先遍历

层序遍历

from binarytree import Node

root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.right = Node(6)
print(root)
print(root.levelorder)

在这里插入图片描述

什么是二叉堆

二叉堆本质上是一种完全二叉树,分为最大堆和最小堆
最大堆的任何一个父节点的值都大于或等于右孩子或左孩子节点的值
最小堆的任何一个父节点的值,都小于或等于他的左孩子或右孩子的值。
二叉堆的根节点叫堆顶
最大堆和最小堆的特点决定了,最大堆的堆顶的堆顶使整个堆中的最大元素,最小堆的堆顶使整个堆中的最小元素。

from binarytree import Node

root = Node(1)
root.left = Node(3)
root.right = Node(2)
root.right.left = Node(7)
root.right.right =Node(8)
root.left.left = Node(6)
root.left.right = Node(5)
root.left.left.left = Node(9)
root.left.left.right = Node(10)
root.left.right.right = Node(0)

print(root)

在这里插入图片描述

什么是优先队列

优先队列分为最大优先队列和最小优先队列
最大优先队列,无论入队顺序如何,都是当前最大的元素优先出队
最小优先队列,无论入队顺序如何,都是当前最小的元素优先出队

优先队列的特点

优先队列具有队列的所有特性,包括队列的基本操作

优先队列如何实现?

在python中可以用到queue来实现队列优先级的尝试

import queue

# 定义元素对象
class test(object):
    def __init__(self, pr, name):
        self.pr = pr
        self.name = name

    def __str__(self):
        return "test(priority={p}, name={n})".format(p=self.pr, n=self.name)

    def __lt__(self, other):
        """ 定义<比较操作符。"""
        # 从大到小排序
        return self.pr > other.pr


tsq = queue.PriorityQueue()

# 插入元素
tsq.put_nowait(test(10, "task1"))  # 先进队列中最大值先出列
tsq.put_nowait(test(1, "task2"))
tsq.put_nowait(test(5, "task3"))

print("未优先队列之前:")
for item in tsq.queue:
    print(item)

print("最大元素优先出列")
print(tsq.get())

print("最大元素出列后剩余元素:")
for item in tsq.queue:
    print(item)
    

在这里插入图片描述
可以看到最大元素10就已经出列,10出列之后,剩余元素5为最大值,所以元素5的顺序排位就调高到最高为止,接下来出列的就是5。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/810619.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

子序列,回文串相关题目

class Solution { public:int dp[2510];int lengthOfLIS(vector<int>& nums) {//dp[i]表示以nums[i]为结尾的最长子序列的长度int nnums.size();for(int i0;i<n;i){dp[i]1;}for(int i1;i<n;i){for(int j0;j<i;j){if(nums[i]>nums[j]){dp[i]max(dp[i],dp[…

因子分解机介绍和PyTorch代码实现

因子分解机&#xff08;Factorization Machines&#xff0c;简称FM&#xff09;是一种用于解决推荐系统、回归和分类等机器学习任务的模型。它由Steffen Rendle于2010年提出&#xff0c;是一种基于线性模型的扩展方法&#xff0c;能够有效地处理高维稀疏数据&#xff0c;并且在…

用Blender做一个足球烯C60

文章目录 作图思路先做一个足球球棍模型平滑 Blender初学者入门&#xff1a;做一个魔方 作图思路 C 60 C_{60} C60​是由60个碳原子构成&#xff0c;形似足球&#xff0c;又名足球烯。而足球的顶点&#xff0c;可以通过正二十面体削去顶点得到&#xff0c;原理可参照这篇&…

基于数据驱动的多尺度表示的信号去噪统计方法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

React组件进阶之children属性,props校验与默认值以及静态属性static

React组件进阶之children属性,props校验与默认值以及静态属性static 一、children属性二、props校验2.1 props说明2.2 prop-types的安装2.3 props校验规则2.4 props默认值 三、静态属性static 一、children属性 children 属性&#xff1a;表示该组件的子节点&#xff0c;只要组…

网站创建004:跟用户交互的标签

input 系列&#xff1a; <body><input type"text" /> <!--文本输入框--><input type"password" /> <!--密码输入框--><input type"checkbox" /> <!--复选框--><input type"checkbox"…

【MySQL】使用C语言连接

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《零基础入门MySQL》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录 &#x1f449;my…

用CSS和HTML写一个水果库存静态页面

HTML代码&#xff1a; <!DOCTYPE html> <html> <head><link rel"stylesheet" type"text/css" href"styles.css"> </head> <body><header><h1>水果库存</h1></header><table>…

函数指针及其使用

类比 数组的地址 函数的地址 数组指针 函数的指针 函数指针的运用 有趣的代码1

从0到1构建基于自身业务的前端工具库

前言 在实际项目开发中无论 M 端、PC 端&#xff0c;或多或少都有一个 utils 文件目录去管理项目中用到的一些常用的工具方法&#xff0c;比如&#xff1a;时间处理、价格处理、解析url参数、加载脚本等&#xff0c;其中很多是重复、基础、或基于某种业务场景的工具&#xff0…

链表(一) 单链表操作详解

文章目录 一、什么是链表二、链表的分类1、单向或者双向2、带头或不带头3、循环或不循环 三、无头单向不循环链表的实现SList.hSList.c动态申请一个节点单链表打印单链表尾插单链表头插单链表的尾删单链表头删单链表查找在pos位置前插入单链表在pos位置之后插入x删除pos位置单链…

自动驾驶下半场的“入场券”

交流群 | 进“传感器群/滑板底盘群/汽车基础软件群/域控制器群”请扫描文末二维码&#xff0c;添加九章小助手&#xff0c;务必备注交流群名称 真实姓名 公司 职位&#xff08;不备注无法通过好友验证&#xff09; 作者 | 张萌宇 自动驾驶战争的上半场拼的是硬件和算法&…

DTC介绍

DTC 一般由3个字节组成&#xff1a; 字节1&#xff1a;High Byte bit 7-6: 对应DTC属于哪一个系统&#xff0c;P: 00动力系统、C: 01底盘、B: 10车身和U: 11通信系统bit 5-4: 用来区分DTC是标准组织所定义还是制造商自定义 00: ISO/SAE01: 制造商10: ISO/SAE11: ISO/SAE bit 3…

【Rust教程 | 基础系列2 | Cargo工具】Cargo介绍及使用

文章目录 前言一&#xff0c;Cargo介绍1&#xff0c;Cargo安装2&#xff0c;创建Rust项目2&#xff0c;编译项目&#xff1a;3&#xff0c;运行项目&#xff1a;4&#xff0c;测试项目&#xff1a;5&#xff0c;更新项目的依赖&#xff1a;6&#xff0c;生成项目的文档&#xf…

python皮卡丘字符打印代码,用python皮卡丘的代码

大家好&#xff0c;本文将围绕python皮卡丘字符打印代码展开说明&#xff0c;python皮卡丘编程代码教程是一个很多人都想弄明白的事情&#xff0c;想搞清楚python皮卡丘编程代码需要先了解以下几个事情。 1、我用python画皮卡丘&#xff0c;没有错误出现&#xff0c;我也打开才…

内网横向移动—NTLM-Relay重放Responder中继攻击LdapEws

内网横向移动—NTLM-Relay重放&Responder中继攻击&Ldap&Ews 1. 前置了解1.1. MSF与CS切换权限1.1.1. CS会话中切换权限1.1.1.1. 查看进程1.1.1.2. 权限权限 1.1.2. MSF会话中切换权限 2. NTLM中继攻击—Relay重放—SMB上线2.1. 案例测试2.1.1. 同账户密码测试2.1.2…

如何使用CRM系统进行客户关系维护管理?

企业要想持续的发展&#xff0c;就必须管理和维护与客户的关系。但如今客户需求更加复杂和多样化&#xff0c;维护客户关系的难度越来越大。许多企业使用CRM系统来帮助自己管理客户关系。通过本文&#xff0c;让您客户关系维护管理全知道。 1、客户画像 CRM系统可以帮助企业建…

【【萌新的stm32学习-1】】

萌新的stm32学习 冯诺依曼结构 采用了分时复用的结构 优点&#xff1a;总线资源占用少 缺点&#xff1a;执行效率低 哈佛结构 执行效率高 总线资源占用多 RISC 这是精简指令集的意思 arm公司 ARMv9是2021年发布的最新 Cortex-A 最好高性能 Cortex-R 中 Cortex-M 低 何为STM…

VScode的简单使用

一、VScode的安装 Visual Studio Code简称VS Code&#xff0c;是一款跨平台的、免费且开源的现代轻量级代码编辑器&#xff0c;支持几乎主流开发语言的语法高亮、智能代码补全、自定义快捷键、括号匹配和颜色区分、代码片段提示、代码对比等特性&#xff0c;也拥有对git的开箱…

Flutter - 微信朋友圈、十字滑动效果(微博/抖音个人中心效果)

demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新&#xff0c;请前往github查看最新代码 前言 一般APP都有类似微博/抖音个人中心的效果&#xff0c;支持上下拉刷新&#xff0c;并且顶部有个图片可以下拉放大&#xff0c;图片底部是几个tab&#xff0c;可…