数据结构(7.3_1)——二叉排序树

news2024/11/16 15:35:49

二叉排序树,又称二叉查找树(BST,Binary Search Tree)

一棵二叉树或者是空二叉树,或者是具有如下性质的二叉树:

  • 左子树上所有结点的关键字均小于根结点的关键字;
  • 右子树上所有结点的关键字均大于根结点的关键字;
  • 左子树和右子树又各是一棵二叉排序树;

左子树结点值<根结点值<右子树结点值

进行中序遍历,可以得到一个递增的有序序列

二叉排序树可用于元素的有序组织,搜索 

二叉排序树的查找

  • 若树非空,则目标值与根结点的值比较;
  • 若相等,则查找成功;
  • 若小于根结点,则在左子树上查找,否则在右子树查找;
  • 查找成功,返回结点指针;查找失败返回NULL

例:查找关键字为30的结点

代码:

 最坏空间复杂度O(1)


//二叉排序树结点
typedef struct BSTNode {
	int key;
	struct BSTNode* lchild, * rchild;
}BSTNode,*BSTree;

//在二叉排序树中查找值为key的结点
BSTNode* BST_Search(BSTree T, int key) {
	while (T != NULL && key != T->key) { //若树空或等于根结点值,则接受循环
		if (key < T->key)
			T = T->lchild;//小于,则在左子树上查找
		else
			T = T->rchild;//大于,则在右子树上查找
	}
	return T;
}

查找失败的情况 :

 

在二叉排序树中查找值为key的结点(递归实现)

 最坏空间复杂度O(h)

//在二叉排序树中查找值为key的结点(递归实现)
BSTNode* BSTSearch(BSTree T, int key) {
	if(T==NULL)
		return NULL;//查找失败
	if (key == T->key)
		return T;//查找成功
	else if (key < T->key)
		return BSTSearch(T->lchild, key);//在左子树中找
	else
		return BSTSearch(T->rchild, key);//在右子树中找
}

二叉排序树的插入 

若原二叉排序树为空,则直接插入结点;否则,若关键字k小于根结点值,则插入到左子树,若关键字k大于根结点值,则插入到右子树

//在二叉排序树中插入关键字为k的新结点(递归实现)
int BST_Insert(BSTree &T, int k) {
	if (T == NULL) {//原树为空,新插入的结点为根结点
		T = (BSTree)malloc(sizeof(BSTNode));
		T->key = k;
		T->lchild = T->rchild = NULL;
		return 1;//返回1,插入成功
	}
	else if (k == T->key)//树中存在相同关键字的结点,插入失败
		return 0;
	else if (k < T->key)//插入到T的左子树
		return BST_Insert(T->lchild, k);
	else//插入到T的左子树
		return BST_Insert(T->rchild, k);
}

注意:新插入的结点一定是叶子结点 

最坏空间复杂度O(h)

非递归插入

int BST_Insert(BSTree& T, int k) {
	while (T!= NULL) { // 当找到空位置时停止循环
		if (k < T->key) {
			T = T->lchild; // 移动到左孩子
		}
		else if (k > T->key) {
			T = T->rchild; // 移动到右孩子
		}
		else {
			// 如果键值已存在,不插入,返回0
			return 0;
		}
	}
	// 创建新节点并插入到找到的位置
	T = (BSTree)malloc(sizeof(BSTNode));
	if (T== NULL) { // 内存分配失败
		return 0;
	}
	T->key = k;
	T->lchild = T->rchild = NULL;
	return 1; // 插入成功

 

二叉排序树的构造

例题:

//按照str[]中的关键字序列建立二叉排序树
void Creat_BST(BSTree& T, int str[], int n) {
	T = NULL;//初始T为空树
	int i = 0;
	while (i < n) {//依次将每个关键字插入到二叉排序树中
		BST_Insert(T, str[i]);
		i++;
	}
}

 

二叉排序树的删除 

先搜索找到目标结点:

1:若被删除结点z是叶结点,则直接删除,不会破坏二叉排序树的性质

2:若结点z只有一棵左子树或右子树,则让z的子树成为z父结点的子树,替代z的位置

3:若结点z有左、右两棵子树,则令z的直接后继(或直接前驱)替代z,然后从二叉排序树中删去这个直接后继(或直接前驱),这样就转换成了第一或第二种情况。

直接后继:

直接前驱:

 

查找效率分析

查找长度——在查找运算中,需要对比关键字的次数称为查找长度,反映了查找操作时间复杂度

查找成功: 

查找失败:

总结:

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

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

相关文章

系统优化工具 | PC Cleaner v9.7.0.3 绿色版

PC Cleaner是一款功能强大的电脑清理和优化工具&#xff0c;旨在通过清理系统垃圾文件、解除恶意软件和优化系统性能来提高计算机的运行效率。该软件提供了多种功能&#xff0c;可以帮助用户维护和提升计算机的整体表现。 PC Cleaner 支持 Windows 7 及以上操作系统&#xff0…

餐饮+KTV点歌一体化思路-—SAAS本地化及未来之窗行业应用跨平台架构

一、餐饮KTV点歌一体化 1. 多元化体验&#xff1a;为顾客提供了餐饮和娱乐的双重享受&#xff0c;满足了不同需求&#xff0c;增加了顾客的停留时间和消费可能性。 2. 增加消费机会&#xff1a;顾客在享受美食的同时可以唱歌娱乐&#xff0c;可能会增加酒水、小吃等额外消费。…

【我的 PWN 学习手札】Unlink Attack

目录 前言 一、Unlink介绍 二、保护和限制 &#xff08;1&#xff09;FD->bk P AND BK->fd P &#xff08;2&#xff09;chunksize(P) prev_size(next_chunk(P)) &#xff08;3&#xff09;largebin chunk 三、适用场景 四、利用与绕过 &#xff08;1&#…

Day 11-12:查找

目录 概念 方法 折半查找 前提 算法思路 分块查找 算法思路 哈希表 概念 构造哈希函数的方法 保留除数法 处理冲突的方法 开放地址法&#xff08;二次探查法&#xff09; 链地址法&#xff08;重要&#xff09; 哈希表的实现 结构体的创建 哈希表的创建 哈希…

Agent实战——使用 Dify 和 Moonshot API 构建 AI 工作流

引言 在当今的大模型应用浪潮中&#xff0c;AI Agent的开发和集成已经成为技术革新的重要方向。随着大模型的不断进步&#xff0c;如何利用这些强大的模型来简化复杂的任务&#xff0c;并将其集成到企业的生产环境中&#xff0c;成为开发者和企业共同关注的焦点。在2024年稀土…

linux-L3_linux 查看进程(node-red)

linux 查看进程 以查看进程node-red为例 ps aux | grep node-red

自制游戏手柄--Android画面的input输入控制

在使用传感器获取到运动数据后&#xff0c;怎样转换为input事件传给手机呢&#xff0c;这里以Android为例&#xff0c; 我们可以考虑以下方式&#xff1a; 1. 物理方式&#xff0c;使用舵机连接触碰笔去实现&#xff0c; 2. 构造MotionEvent事件&#xff0c;注入input&#…

Python之 条件与循环(Python‘s Conditions and loops)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

linux环境下手动安装mysql

没想到兜兜转转这么些年&#xff0c;今天申请个云服务器用来搭建求生2服务器&#xff0c;先用mysql来测试&#xff0c;结果还是花了相当久的时间。 基本所有单节点部署应用到linux环境&#xff0c;都三个流程&#xff1a; 1 下载安装包 2 解压修改配置文件 3 运行启动脚本 我们…

Idea 中的一些配置

配置 javap jdk 自带的 javap 可以用来查看字节码信息。 配置过程&#xff1a; 打开设置&#xff0c;定位到 Tools&#xff0c;External Tools新建项&#xff0c;Program 中填 javap 的路径Argument 中填 -c $FileClass$Working directory 中填 $OutputPath$ Argument 中也…

【有啥问啥】复习变分下界即证据下界(Evidence Lower Bound, ELBO):原理与应用

复习变分下界即证据下界&#xff08;Evidence Lower Bound, ELBO&#xff09;&#xff1a;原理与应用 变分下界&#xff08;Variational Lower Bound&#xff09;&#xff0c;也称为“证据下界”&#xff08;Evidence Lower Bound, ELBO&#xff09;&#xff0c;是概率模型中的…

Golang | Leetcode Golang题解之第403题青蛙过河

题目&#xff1a; 题解&#xff1a; func canCross(stones []int) bool {n : len(stones)dp : make([][]bool, n)for i : range dp {dp[i] make([]bool, n)}dp[0][0] truefor i : 1; i < n; i {if stones[i]-stones[i-1] > i {return false}}for i : 1; i < n; i {…

产品探秘|开物——面向AI原生和云原生网络研究的首选科研平台

在当今高速发展的信息技术领域&#xff0c;特别是对于那些致力于前沿科技探索与实践的高校而言&#xff0c;拥有一款能够支持复杂网络业务研究与开发的平台至关重要。开物™数据网络开发平台&#xff08;Data Network Development Platform&#xff0c;简称DNDP&#xff09;&am…

el-input 只能输入数字和一个小数点,或者只能输入正整数

只能输入框只能输入正整数&#xff0c;输入同时禁止了以0开始的数字输入&#xff0c;防止被转化为其他进制的数值。 下面为案例&#xff1a; <!-- 不能输入零时--> <input typetext oninput"valuevalue.replace(/^(0)|[^\d]/g,)"><!-- 能输入零时-…

const 声明变量 报错Missing initializer in const declaration

近日用const 声明一个变量发现一个问题&#xff0c;如果声明的同时没有赋值&#xff0c;就会报错Missing initializer in const declaration 以下是分别以const、let、var声明显示的结果 const 方式声明 const a null const b const c 1 const d 2 const e false console…

Java | Leetcode Java题解之第404题左叶子之和

题目&#xff1a; 题解&#xff1a; class Solution {public int sumOfLeftLeaves(TreeNode root) {if (root null) {return 0;}Queue<TreeNode> queue new LinkedList<TreeNode>();queue.offer(root);int ans 0;while (!queue.isEmpty()) {TreeNode node que…

c++206 友元类

#include<iostream> using namespace std; class A { public://声明的位置 和public private无关friend void modifyA(A* pA, int _a);//函数modifyA是A的好朋友A(int a, int b){this->a a;this->b b;}int getA(){return this->a;} private:int a;int b; };vo…

频带宽度固定,如何突破数据速率的瓶颈?

目录 目录 引言 信道 频带宽度 信噪比 信噪比的重要性 影响信噪比的因素 码元 码元的特点&#xff1a; 码元与比特的关系&#xff1a; 码元的作用&#xff1a; 码元的类型&#xff1a; Question 类比解释&#xff1a; 技术解释&#xff1a; 引言 在现代通信系统中…

Python | Leetcode Python题解之第404题左叶子之和

题目&#xff1a; 题解&#xff1a; class Solution:def sumOfLeftLeaves(self, root: TreeNode) -> int:if not root:return 0isLeafNode lambda node: not node.left and not node.rightq collections.deque([root])ans 0while q:node q.popleft()if node.left:if is…

Tomcat_使用IDEA开发javaWeb工程并部署运用

目录 1.配置文件 点击file projectStructure 配置SDK和language level的语言版本一致。apply然后ok。 2. 然后点击web-all创建一个moudle叫做demo02-web02。 3.这仅仅是一个java的目录结构&#xff0c;我们需要把他转换成javaweb的结构。所以我们需要添加web资源组件。右…