二叉搜索树BST

二叉排序树查找 二叉排序树:         二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树(Binary Search Tree)。其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树:             ①若它的左子树非空,则左子树上所有结点的值均小于根结点的值;             ②若它的右子树非空,则右子树上所有结点的值均大于根结点的值; 阅读详情

在二叉搜索树b中查找x的过程为:

1.若b是空树,则搜索失败,否则:

2.若x等于b的根结点的数据域之值,则查找成功;否则

3.若x小于b的根结点的数据域之值,则搜索左子树:否则

4.查找右子树

// 指针parent指向pRoot的父节点,其初始调用值为NULL
// 若查找成功,指针pTarget指向目标节点,函数返回true
// 否则指针pTarget指向查找路径上访问的最后一个节点,函数返回false
// pTarget初始值为NULL,由于函数调用过程中需要修改其指针值,所以参数传递双层指针
bool searchBST(BinaryTreeNode* pRoot, int key, BinaryTreeNode* parent, BinaryTreeNode** pTarget)
{
	if(pRoot == NULL)
	{
		*pTarget = parent;
		return false;
	}

	if(pRoot->value == key)
	{
		*pTarget = pRoot;
		return true;
	}
	else if(pRoot->value > key)
		return searchBST(pRoot->left, key, pRoot, pTarget);
	else
		return searchBST(pRoot->right, key, pRoot, pTarget);
}


向一个二叉搜索树b中插入一个节点s的算法,过程为:

1.若b是空树,则将s所指节点作为根节点插入,否则:

2.若s->value等于b的根节点的数据域之值,则返回,否则:

3.若s->value小于b的根节点的数据域之值,则把s所指节点插入到左子树中,否则:

4.把s所指节点插入到右子树中。(新插入节点总是叶子节点)

// 当树为空时,需要修改根结点指针值,所以参数传递双层指针
bool insertBST(BinaryTreeNode** pRoot, int key)
{
	if(*pRoot == NULL)
	{
		BinaryTreeNode* s = new BinaryTreeNode;
		s->value = key;
		s->left = s->right = NULL;
		*pRoot = s;
		return true;
	}
	else if((*pRoot)->value == key)
		return false;

	if((*pRoot)->value > key)
		return insertBST(&(*pRoot)->left, key);
	else
		return insertBST(&(*pRoot)->right, key);
}

在二叉查找树中删去一个节点,分三种情况讨论:

1.若*p节点为叶子节点,即PL(左子树)和PR(右子树)均为空树。由于删去叶子节点不破坏整棵树的结构,则只需修改其双亲节点的指针即可。

2.若*p节点只有左子树PL或右子树PR,此时只要另PL或PR直接成为其双亲节点*f的左子树(当*p是左子树)或右子树(当*p是右子树)即可。

3.若*p节点的左子树和右子树均不空。在删去*p之后,为保持其它元素之间的相对位置不变,可按中序遍历保持有序进行调整,可以有两种做法:其一是另*p的直接前驱(inorder predecessor)或直接后继(inorder successor)替代*p,然后再从二叉查找树中删去它的直接前驱(或直接后继)

bool deleteNode(BinaryTreeNode** pRoot)
{
	BinaryTreeNode* q, *s;
	if((*pRoot)->left == NULL && (*pRoot)->right == NULL)
	{
		delete *pRoot;
		*pRoot = NULL;
	}
	else if((*pRoot)->right == NULL)
	{
		q = (*pRoot)->left;
		(*pRoot)->value = q->value;
		(*pRoot)->left = q->left;
		(*pRoot)->right = q->right;

		delete q;
	}
	else if((*pRoot)->left == NULL)
	{
		q = (*pRoot)->right;
		(*pRoot)->value = q->value;
		(*pRoot)->left = q->left;
		(*pRoot)->right = q->right;

		delete q;
	}
	else
	{
		q = *pRoot;
		s = (*pRoot)->left;
		while(s->right)
		{
			q = s;
			s = s->right;
		}
		(*pRoot)->value = s->value;
		if(q != *pRoot)
			q->right = s->left;
		else
			q->left = s->left;

		delete s;
	}

	return true;
}

bool deleteBST(BinaryTreeNode** pRoot, int key)
{
	if(*pRoot == NULL)
		return false;

	if((*pRoot)->value == key)
		return deleteNode(pRoot);
	else if((*pRoot)->value > key)
		return deleteBST(&(*pRoot)->left, key);
	else
		return deleteBST(&(*pRoot)->right, key);
}

完整验证代码:

#include <iostream>

using namespace std;

struct BinaryTreeNode
{
	int value;
	BinaryTreeNode* left, *right;
};

// 指针parent指向pRoot的父节点,其初始调用值为NULL
// 若查找成功,指针pTarget指向目标节点,函数返回true
// 否则指针pTarget指向查找路径上访问的最后一个节点,函数返回false
// pTarget初始值为NULL,由于函数调用过程中需要修改其指针值,所以参数传递双层指针
bool searchBST(BinaryTreeNode* pRoot, int key, BinaryTreeNode* parent, BinaryTreeNode** pTarget)
{
	if(pRoot == NULL)
	{
		*pTarget = parent; 
		return false;
	}

	if(pRoot->value == key)
	{
		*pTarget = pRoot;
		return true;
	}
	else if(pRoot->value > key)
		return searchBST(pRoot->left, key, pRoot, pTarget);
	else
		return searchBST(pRoot->right, key, pRoot, pTarget);
}

// 当树为空时,需要修改根结点指针值,所以参数传递双层指针
bool insertBST(BinaryTreeNode** pRoot, int key)
{
	if(*pRoot == NULL)
	{
		BinaryTreeNode* s = new BinaryTreeNode;
		s->value = key;
		s->left = s->right = NULL;
		*pRoot = s;
		return true;
	}
	else if((*pRoot)->value == key)
		return false;

	if((*pRoot)->value > key)
		return insertBST(&(*pRoot)->left, key);
	else
		return insertBST(&(*pRoot)->right, key);
}

bool deleteNode(BinaryTreeNode** pRoot)
{
	BinaryTreeNode* q, *s;
	if((*pRoot)->left == NULL && (*pRoot)->right == NULL)
	{
		delete *pRoot;
		*pRoot = NULL;
	}
	else if((*pRoot)->right == NULL)
	{
		q = (*pRoot)->left;
		(*pRoot)->value = q->value;
		(*pRoot)->left = q->left;
		(*pRoot)->right = q->right;

		delete q;
	}
	else if((*pRoot)->left == NULL)
	{
		q = (*pRoot)->right;
		(*pRoot)->value = q->value;
		(*pRoot)->left = q->left;
		(*pRoot)->right = q->right;

		delete q;
	}
	else
	{
		q = *pRoot;
		s = (*pRoot)->left;
		while(s->right)
		{
			q = s;
			s = s->right;
		}
		(*pRoot)->value = s->value;
		if(q != *pRoot)
			q->right = s->left;
		else
			q->left = s->left;

		delete s;
	}

	return true;
}

bool deleteBST(BinaryTreeNode** pRoot, int key)
{
	if(*pRoot == NULL)
		return false;

	if((*pRoot)->value == key)
		return deleteNode(pRoot);
	else if((*pRoot)->value > key)
		return deleteBST(&(*pRoot)->left, key);
	else
		return deleteBST(&(*pRoot)->right, key);
}

void printInorder(BinaryTreeNode* pRoot)
{
	if(pRoot->left != NULL)
		printInorder(pRoot->left);

	printf("%d ", pRoot->value);

	if(pRoot->right != NULL)
		printInorder(pRoot->right);
}

int main()
{
	int a[10] = {62, 88, 58, 47, 35, 73, 51, 99, 37, 93};
	BinaryTreeNode* pRoot = NULL;
	printf("Build the binary search tree:\n");
	for(int i = 0; i < 10; i++)
	{
		insertBST(&pRoot, a[i]);
		printInorder(pRoot);
		printf("\n");
	}

    printf("which node do you want to delete?\n");
	int num = 0;
	while(scanf("%d", &num))
	{

		deleteBST(&pRoot, num);
		printInorder(pRoot);
		printf("\n");
	}

	return 0;
}
                                








数据结构之查找(三)--二叉排序树(BST)的查找、插入和删除 一、二叉排序树的查找二、二叉排序树的插入三、二叉排序树的删除 阅读详情

相关推荐

二叉搜索树BST的C++实现

BST 包含的功能:插入,删除,查找,查找某一结点的后续和前驱,中序遍历和前序遍历 这里,用于实验的二叉树: //二叉搜索树BST #include #include using namespace std; class TreeNode{ public: int key; TreeNode* left; TreeNode* right; TreeNode* p;//

liuchenjane的博客 6608

数据结构学习——二叉搜索树BST相关代码(c++实现)

二叉搜索树的c++实现 #include<windows.h> #include<iostream> using namespace std; typedef int DataType; struct node{ public: node() :key(0), left(nullptr), right(nullptr), father(nullp...

现从事游戏开发领域 | 团队项目be_with开发进行中 web方向感兴趣者私 ——We can do all things. 738

C++进阶——二叉搜索树BST

C++进阶——二叉搜索树BST

weixin_43635473的博客 995

二叉搜索树(BST)

1.概念 1.1二叉树的定义 与其他数据结构一样,二叉搜索树也是由一组数据项所构成的集合。二叉搜索树是一种查找、插入和删除效率都很好的一种数据结构。首先,判断一个树是否为二叉搜索树应该满足以下几点: 1.该树首先是二叉树。 2.对于任意结点点,如果该结点的左子树存在,左子树上的点都不比该结点更大,如果右子树存在,右子树上的点都不比该结点小。如图1-1,展示了一棵二叉搜索树。 1.2二叉搜索树访问方式 数据项之间,依赖各自关键码彼此区分,通过查询关键码查找对应的值。我们称这种访问为...

ydg的博客 484

(一)BST树(二叉搜索树)

(一)BST树(二叉搜索树) 1.BST二叉搜索树 1.1BST树的定义 1 BST树也是一个二叉树,故满足递归定义; 2 其次每个节点只存在一个值; 3 需满足左子树值<=根值<=右子树,故按照中序遍历会得到一个非递减序列。 BST涉及操作主要增,删,查,除了删麻烦一点,其他操作均可递归实现,二叉查找树的一般性质: 1.在一棵二叉查找树上,执行查找、插入、删除等操作,的时间复杂度为O(log2n)。因为,一棵由n个结点,随机构造的二叉查找树的高度为log2n,所以顺理成章,一般操作的执行时间为

qq_42119136的博客 5219

华为防火墙NAT避坑指南:当双ISP出口遇到服务器发布,这些细节不注意会翻车

本文深入解析华为防火墙在双ISP出口环境下服务器发布的实战配置,重点探讨no-reverse参数对Server-Map表的影响、源进源出功能的实现及线路切换时的会话保持问题。通过策略路由和智能选路技术,确保HTTP/FTP服务在多运营商链路中的高可用性,避免路径不对称和NAT映射冲突等常见陷阱。

weixin_30897233的博客 549

二叉搜索树--基础篇

二叉搜索树Binary Search Tree(BSTs)又名二叉排序树,二叉查找树。而能够自平衡的叫平衡搜索树,包括AVL trees, 2-3 trees, 2-3-4 trees, B-trees, Red-Black Trees红黑树,skip lists跳跃表。   在二叉搜索树的基础上,又有最优二叉搜索树。 一、二叉搜索树的定义     二叉搜索树或者是一棵空树,或者是具有下列性

yinlili2010的专栏 1024

微信小程序如何转云开发

小程序转云开发

zhangxiaobai___的博客 3914

BST(二叉搜索树)

BST(二叉搜索树) 所谓二叉搜索树(Binary Search Tree,简称 BST)大家应该都不陌生,它是一种特殊的二叉树。 特殊在哪里呢? 简单来说就是:左小右大。 BST的完整定义如下: BST 中任意一个节点的左子树所有节点的值都小于该节点的值,右子树所有节点的值都大于该节点的值。 BST 中任意一个节点的左右子树都是 BST。 有了BST的这种特性,就可以在二叉树中做类似二分搜索的操作,搜索一个元素的效率很高。 一个合法二叉树的举例 对于 BST 相关的问题,你可能会经常看到类似下面

毕业才是起点 7293

无线控制的隐形桥梁:深入解析NRF24L01在电机控制中的数据传输艺术

本文深入解析NRF24L01无线模块在电机控制中的数据传输技术,涵盖通信机制优化、抗干扰策略及实时性保障。通过舵机和无刷电机的实战案例,展示如何构建稳定高效的无线控制系统,为嵌入式开发提供完整解决方案。

j7k8l的博客 333

MSPM0G3507电赛控制板设计:电机驱动与多传感器融合

微控制器是嵌入式控制系统的核心处理单元,其性能与外设集成度直接决定实时控制能力。基于Arm Cortex-M0+内核的MCU凭借低功耗、高性价比和丰富模拟资源,成为大学生电子设计竞赛等工程实践场景的主流选择。本文围绕MSPM0G3507展开,深入解析双路电机驱动(TB6612FNG)、多源传感采集(MPU6050+ADC电压监测)及抗干扰硬件架构等关键技术,强调电源隔离、信号完整性与鲁棒性设计对72小时封闭竞赛环境的关键支撑作用。典型应用涵盖巡线小车运动控制、姿态解算与蓝牙/Zigbee协同通信,为控制类赛

weixin_42588672的博客 539

BST二叉搜索树

然后我们比较要插入的值和当前节点的值,如果要插入的值小于当前节点的值,则将其插入到左子树中;遍历顺序为“左-根-右”。先递归遍历左子树,然后访问根节点,最后递归遍历右子树。对于二叉搜索树来说,中序遍历会得到一个按节点值升序排列的序列,这是BST特有的性质,常用于BST的排序输出或验证BST的性质。这是因为BST的性质保证了左子树的所有节点值小于根节点值,而右子树的所有节点值大于根节点值。在二叉树中删除一个节点是一个相对复杂的过程,尤其是当涉及到二叉搜索树(BST)时,因为删除操作需要维护树的性质。

超级博客 1202

YOLO环境配置+项目启动全流程(Conda+PyCharm超详解)

YOLO(You Only Look Once)是一个基于深度学习的目标检测算法,广泛应用于智能识别领域。本篇保姆级教学将手把手教你如何从零开始运行一个YOLO项目,适合完全没有基础的新手。

一键难忘的博客 1539

【C++】二叉搜索树(BST)

在数据结构中学习过二叉树,链式二叉树,顺序二叉树,区别于二者的的一种特殊的二叉树是二叉搜索树BST。

A.的博客 1818

强化学习优化多目标冲突推理的决策过程设计

1. 背景介绍 强化学习(Reinforcement Learning,RL)作为机器学习的一个重要分支,近年来在计算机科学和人工智能领域取得了显著的进展。其核心思想是通过试错来学习最优策略,从而在复杂的环境中实现目标。然而,在多目标冲突推理(Multi-Objective Conflict Reasoning,MOCR)问题上,强化学习面临着诸多挑

AI天才研究院 1511

【用unity实现100个游戏之2】复刻实现经典2d平台跳跃游戏《蔚蓝 Celeste》(附工程源码)

蔚蓝》是一款备受好评的独立游戏,由游戏开发工作室开发并由发行。这款游戏于2016年首次发布,并在玩家和评论界收获了广泛赞誉。蔚蓝以其独特的艺术风格和引人入胜的故事而著称。游戏以深海为背景,玩家将扮演一个能够探索水下世界的神秘生物。游戏通过惊人的视觉表现和动态的海洋生态系统为玩家带来了令人难忘的游戏体验。无论是广阔的水下景观还是充满生机的海洋生物,蔚蓝都让玩家感受到深海的神秘和美丽。蔚蓝在玩法上注重探索和解谜。玩家可以在海底环境中自由游动,发现隐藏的地点和秘密,与各种生物互动,并解决环境谜题以继续前进。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4167

二叉搜索树BST的学习

对于 BST 的每一个节点node,左子树节点的值都比node的值要小,右子树节点的值都比node的值大。对于 BST 的每一个节点node,它的左侧子树和右侧子树都是 BST。二叉搜索树并不算复杂,但我觉得它可以算是数据结构领域的半壁江山,直接基于 BST 的数据结构有 AVL 树,红黑树等等,拥有了自平衡性质,可以提供 logN 级别的增删查改效率;还有 B+ 树,线段树等结构都是基于 BST 的思想来设计的。对于每一个节点root,代码值检查了它的左右孩子节点是否符合左小右大的原则;

weixin_52055811的博客 864

virtuoso如何导出def?

在DEF Out界面,填写def name,library name以及cell name ,cell view既layout,把Output "Floating Shapes" into SPECIAL NETS Section勾上,OK即可。2)在要导出的layout界面选中PAD和prBoundary(shift+左键),快捷键C copy到空cell里,这时需要调整copy过来的object坐标,让两边prBoundary的坐标相同。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 2306

BST 二叉搜索树

目录一、BST概念二、BST的查找、插入和遍历1、查找2、插入3、遍历(1)前序(2)中序(递增显示)(3)后序(4)深度优先(5)广度优先4、删除(1)无左子结点时(2)有左子结点时三、定义一个树接口四、实现BST类 五、数据压缩:哈夫曼编码前几天学习了堆排序,其实堆排序用到的结构就是二叉树。那么BST是满足如下规则的二叉树:遵循BST“左小右大”的原则,查询时从根结点向下依次查找各个子树,直到 子树为空 或 已查询到 为止。否则设置的对比current结点将一直与目标值比较,小于当前结点时赋给curre

Yan__Ran的博客 822

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

二叉搜索树BST总结

文章目录1. 概念2. 基本操作2.1 查找2.2 插入2.3 删除3. 性能分析 1. 概念 二叉搜索树又称二叉排序树,一颗BST应该满足以下特点: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值; 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值; 上图就是一颗二叉搜索树,对它进行中序遍历后得到的结果是[1,2,3,4,5,6,7,8,9],我们不难发现它是一个递增的序列,注意这是二叉搜索树的一个重要性质:BST中序遍历的结果呈增序排列。 在很多涉及BST的问题中都要先考

Emperor10的博客 474

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Python实现二叉搜索树BST

Python实现BST 二叉排序树(BST)又称二叉查找树、二叉搜索树 二叉排序树(Binary Sort Tree)又称二叉查找树。它或者是一棵空树;或者是具有下列性质的二叉树: 1.若左子树不空,则左子树上所有结点的值均小于根结点的值; 2.若右子树不空,则右子树上所有结点的值均大于根节点的值; 3.左、右子树也分别为二叉排序树。 求树深度 按序输出...

神不烦 2338

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

算法 {二叉搜索树BST,自平衡BST}

算法 {二叉搜索樹BST}

qq_66485519的博客 507

验证二叉搜索树BST

BST: 二叉搜索树,每一个最小BST的左节点,都要小于它的root,而右节点都要大于它的root;但是要看子数是否也满足这种情况,右节点子树的左节点,也要小于子树的root,但是大于父树的root。 例如上面图中的3节点要大于5,但是要小于6,不然不满足BST的定义 代码 看一下leetcode原图 public class IsValidBST { public static cl...

岳麓山炒粉的博客 270
上一篇: 指向指针的指针和指针的引用
下一篇: 八皇后
Praker
博客等级 码龄13年 12粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值