备战蓝桥杯Day25 - 二叉搜索树

一、基本概念

二叉搜索树(Binary Search Tree),又称为二叉查找树或二叉排序树,是一种具有特定性质的二叉树。

  1. 定义:二叉搜索树可以是一棵空树,也可以是具有以下特性的非空二叉树:

    • 若其左子树不空,则左子树上所有结点的值均小于其根结点的值。
    • 若其右子树不空,则右子树上所有结点的值均大于其根结点的值。
    • 它的左、右子树也分别为二叉排序树。
  2. 结构:二叉搜索树是以二叉树的形式组织的,通常可以使用链表数据结构来表示。每个结点除了包含关键字(key)和可能的其他数据外,还包含指向其左孩子(lchild)和右孩子(rchild)的指针,以及指向其父结点(parent)的指针(如果需要的话)。如果某个孩子结点或父结点不存在,则相应属性的值为空(NIL)。

  3. 元素特性:二叉搜索树中存储的元素必须具备可比较性,例如整数(int)或浮点数(double)等。如果是自定义类型,需要指定比较方式。

  4. 应用:二叉搜索树作为一种经典的数据结构,具有链表快速插入与删除操作的特点和数组快速查找的优势。因此,它在许多场合下都有广泛的应用,如在文件系统和数据库系统中用于高效的排序与检索操作。

二叉搜索树是一种非常有效的数据结构,它能够保持数据的有序性,同时提供快速的查找、插入和删除操作。

二、插入操作实现

代码实现

# 定义树的节点
class BiTreeNode:def __init__(self, data):self.data = dataself.lchild = Noneself.rchild = Noneself.parent = Noneclass BST:def __init__(self):  # 初始化二叉搜索树self.root = Nonedef insert(self, node, val):  # 递归定义插入if not node:node = BiTreeNode(val)  # 如果是空树,那么直接创建新的节点插入elif val < node.data:  # 当插入的值小于根节点,就向左子树插入node.lchild = self.insert(node.lchild, val)  # 调用递归函数实现插入节点node.lchild.parent = node   # 并与父节点链接起来elif val > node.data: # 当插入的值大于根节点,就向右子树插入node.rchild = self.insert(node.rchild, val)  # 调用递归函数实现插入节点node.rchild.parent = node  # 并与父节点链接起来return nodedef insert_no_rec(self, val):  # 非递归定义插入  在下面详细解释p = self.rootif not p:   # 空树self.root = BiTreeNode(val)  # 空树时直接新建节点插入即可returnwhile True:if val < p.data:if p.lchild:  # 左孩子存在p = p.lchildelse:   # 左孩子不存在时直接创建节点插入p.lchild = BiTreeNode(val)p.lchild.parent = pelif val > p.data:if p.rchild:  # 右孩子存在p = p.rchildelse:  # 右孩子不存在时直接创建节点插入p.rchild = BiTreeNode(val)p.rchild.parent = preturnelse:return

非递归插入详细过程 

使用非递归函数插入数据详细过程

1、随便定义一颗二叉搜索树(非空),将val = 12 插入到树中 。通过循环比较来实现数值的插入。

先将定义的 p 指针指向根节点,然后开始 val 与 根节点数值的比较。

2、 根据图中数值可知, val = 12 < p.data = 17,且 p点的左孩子 (p.lchild)存在,那么 p 指针向下移动,只执行 if val < p.data: 这块代码,变为如下图所示。

 while True:if val < p.data:if p.lchild:p = p.lchildelse:p.lchild = BiTreeNode(val)p.lchild.parent = p

 

 3.此时, val = 12 < p.data = 13,且 p点的左孩子 (p.lchild)存在,执行 p = p.lchild 语句,那么 p 指针向下移动,变为如下图所示。

4.此时, val = 12 > p.data = 7, 那么他要往右子树进行插入,且p.data 的右孩子不存在,就直接创建新的节点进行插入即可。

 elif val > p.data:if p.rchild:  # 右孩子存在p = p.rchildelse:  # 右孩子不存在时直接创建节点插入p.rchild = BiTreeNode(val)p.rchild.parent = preturn

最后插入结果为:

测试结果

对定义的函数进行测试,分别以先序,中序,后序输出。中序遍历都是从小到大输出,可以用作一种排序。

import random
class BiTreeNode:def __init__(self, data):self.data = dataself.lchild = Noneself.rchild = Noneself.parent = Noneclass BST:def __init__(self, li=None):self.root = Noneif li:for val in li:self.insert_no_rec(val)def insert(self, node, val):  # 递归定义插入if not node:node = BiTreeNode(val)elif val < node.data:node.lchild = self.insert(node.lchild, val)node.lchild.parent = nodeelif val > node.data:node.rchild = self.insert(node.rchild, val)node.rchild.parent = nodereturn nodedef insert_no_rec(self, val):p = self.rootif not p:   # 空树self.root = BiTreeNode(val)returnwhile True:if val < p.data:if p.lchild:p = p.lchildelse:p.lchild = BiTreeNode(val)p.lchild.parent = pelif val > p.data:if p.rchild:p = p.rchildelse:p.rchild = BiTreeNode(val)p.rchild.parent = preturnelse:returndef pre_order(self, root):if root:print(root.data, end=",")self.pre_order(root.lchild)self.pre_order(root.rchild)def in_order(self, root):if root:self.in_order(root.lchild)print(root.data, end=",")self.in_order(root.rchild)def post_order(self, root):if root:self.post_order(root.lchild)self.post_order(root.rchild)print(root.data, end=",")li = list(range(0, 10))
random.shuffle(li)tree = BST(li)
tree.pre_order(tree.root)  # 先序
print(" ")
tree.in_order(tree.root)   # 中序
print(" ")
tree.post_order(tree.root) # 后序

 输出结果

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

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

相关文章

【Memcached】

memcached 有一个很大的缺陷不能持久化&#xff0c;不能存储在硬盘里 1.NoSQL介绍 NoSQL是对 Not Only SQL、非传统关系型数据库的统称。 NoSQL一词诞生于1998年&#xff0c;2009年这个词汇被再次提出指非关系型、分布式、不提供ACID的数据库设计模式。 随着互联网时代的到…

基于springboot+vue实现电子商务平台管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现电子商务平台管理系统演示 研究的目的和意义 据我国IT行业发布的报告表明&#xff0c;近年来&#xff0c;我国互联网发展呈快速增长趋势&#xff0c;网民的数量已达8700万&#xff0c;逼近世界第一&#xff0c;并且随着宽带的实施及降价&#xff0c;每天约有…

Day63:WEB攻防-JS应用算法逆向三重断点调试调用堆栈BP插件发包安全结合

目录 前置知识 JS调试分析 JS分析调试结合Burp JS分析调试知识点&#xff1a; 1、JavaScript-作用域&调用堆栈 2、JavaScript-断点调试&全局搜索 3、JavaScript-Burp算法模块使用 前置知识 JS加密数据走向 浏览器调试 1、作用域&#xff1a;&#xff08;本地&全…

代码随想录算法训练营第四十七天|动态规划|198.打家劫舍、213.打家劫舍II、337.打家劫舍III

198.打家劫舍 文章 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代…

决策树 | 分裂算法:ID3,C4.5,CART

这里写目录标题 一. ID3算法1. 信息增益2. ID3算法特点 二. C4.5算法1. 信息增益率2. C4.5算法特点 三. CART算法1. Gini系数公式2. CART算法特点3. CART回归树的分裂评价指标 小节 在决策树算法逻辑篇中&#xff0c;我们讲解了决策树的构建方式&#xff0c;下面我们来聊一聊决…

Day16 面向对象进阶——接Day15

Day16 面向对象进阶——接Day15 文章目录 Day16 面向对象进阶——接Day15一、抽象类及抽象方法二、接口三、多态四、对象转型五、内部类 一、抽象类及抽象方法 //抽象类 public abstract class 类名{//抽象方法public abstract void method(); }1、抽象方法交给非抽象的子类去…

FreeRtos自学笔记4----参考正点原子视频

静态创建任务函数 TaskHandle_t xTaskCreateStatic { TaskFunction_t pxTaskCode, /* 指向任务函数的指针 / const char * const pcName, / 任务函数名 / const uint32_t ulStackDepth, / 任务堆栈大小注意字为单位 / void * const pvParameters, / 传递的任务函数参数 / UBase…

爬虫需要什么类型的代理ip?代理ip是必备的吗?

在信息时代&#xff0c;网络爬虫作为一种重要的数据采集工具&#xff0c;被广泛应用于各行各业。在这个过程中&#xff0c;代理IP成为了一个备受关注的话题。那么&#xff0c;爬虫需要什么类型的代理IP?代理IP是否是必不可少的呢? 今天我们就一起来看看~ 首先&#xff0c;我…

GPU服务器为什么需要DPU?

随着AI模型的复杂度增加以及数据量爆炸性增长&#xff0c;GPU服务器在执行训练和推理任务时&#xff0c;不仅面临计算密集型问题&#xff0c;还必须处理大量的数据移动、网络通信、存储I/O以及安全防护等非计算密集型任务。这些问题往往会成为性能瓶颈&#xff0c;消耗宝贵的CP…

【教学类-34-11】20240314 动物拼图(Midjounery生成线描图,8*8格拼图块 A4整张)(AI对话大师)

作品展示&#xff1a;——A4整页&#xff08;一人2张纸&#xff09; 背景需求&#xff1a; 通过春天拼图的个别化实验&#xff0c;我发现&#xff1a; 【教学类-34-10】20240313 春天拼图&#xff08;Midjounery生成线描图&#xff0c;4*4格拼图块&#xff09;&#xff08;AI…

在Docker上传我们自己的镜像(以springboot项目为例)

首先确定好在我们的centOS服务器上已经安装并配置好docker 配置自己的springboot镜像并运行 获取springboot的jar包 maven clean--》mavenue package --》复制target目录下生成的jar包 在服务器选择一个文件夹上传jar包&#xff0c;我这里选用的文件夹叫做/opt/dockertest…

【数据结构】树与堆 (向上/下调整算法和复杂度的分析、堆排序以及topk问题)

文章目录 1.树的概念1.1树的相关概念1.2树的表示 2.二叉树2.1概念2.2特殊二叉树2.3二叉树的存储 3.堆3.1堆的插入&#xff08;向上调整&#xff09;3.2堆的删除&#xff08;向下调整&#xff09;3.3堆的创建3.3.1使用向上调整3.3.2使用向下调整3.3.3两种建堆方式的比较 3.4堆排…

河南大学数据分析可视化实验-数据分析基础

计算机与信息工程学院实验报告 姓名&#xff1a; 杨馥瑞 学号&#xff1a;2212080042专业&#xff1a;数据科学与大数据分析技术 年级&#xff1a; 2022 课程&#xff1a; 数据分析和可视化 主讲教师&#xff1a; 周黎鸣 辅导教师&#xff1a; 周黎鸣 …

MISC-Catflag

前言 开始拿到这道题&#xff0c;以为是要识别文件类型&#xff0c;后面发现不是&#xff0c;kali识别为ascii文本文件。而用010editor打开&#xff0c;又是一堆看不懂的码 后面发现有很多重复内容1B 5B 43等等&#xff0c;再看题目type flag or cat flag可以联想linux的cat命…

【1】Python零基础起步

什么是编程(Programming) 编程是编定程序的中文简称&#xff0c;就是让计算机代码解决某个问题&#xff08;目的&#xff09;&#xff0c;对某个计算体系规定一定的运算方式&#xff0c;使计算体系按照该计算方式运行&#xff0c;并最终得到相应结果的过程&#xff08;手段&am…

微信小程序(五十九)使用鉴权组件时原页面js自动加载解决方法(24/3/14)

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.使用覆盖函数的方法阻止原页面的自动执行方法 2.使用判断实现只有当未登录时才进行方法覆盖 源码&#xff1a; app.json {"pages": ["pages/index/index","pages/logs/logs"],…

【无标题】vmprotect net 混淆效果挺不错

vmprotect net 混淆效果挺不错,测试了一个&#xff0c;以前的写程序。用dnspy测试一下&#xff0c;效果非常好。 sunnf0451qq.com

1.MongoDB的特点与应用场景

什么是 MongoDB &#xff1f; MongoDB 是基于 C 开发的 NOSQL 开源文档数据库 &#xff0c;是最像关系型数据库的 nosql&#xff0c;功能也是最丰富的 nosql&#xff0c;它具有所以的可伸缩性&#xff0c;灵活性&#xff0c;高性能&#xff0c;高扩展性的优势。 大致有如下特…

基于SpringBoot的“实习管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“实习管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统首页界面图 学生注册界面图 后台登录界面图 …

【C++面向对象】C++飞机购票订票系统(源码+说明)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…