二叉搜索树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

RK3588S开发板实战:手把手教你搞定IMX415摄像头驱动配置(附调试日志分析)

本文提供了一份详细的RK3588S开发板配置IMX415摄像头驱动的实战指南。内容涵盖从环境准备、内核驱动编译、设备树节点编写到调试日志分析的完整流程,并重点解析了摄像头调试过程中的常见问题与解决方案,帮助开发者快速完成驱动配置与功能验证。

weixin_28285943的博客 205

二叉搜索树--基础篇

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

yinlili2010的专栏 1024

C#:WPF格式转Winform格式

WPF格式转Winform格式

Hello C++ 1295

BST(二叉搜索树)

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

毕业才是起点 7293

ArcGIS属性表汉字转拼音

接着我安装了一个编辑器“PyCharm Community Edition 2019.3.3\bin\pycharm64.exe”,在里面添加“pypinyin”包,然后将其设置为arcgis的编辑器和调试程序,还是失败;我在10.6的机器上折腾了上面几步,直到两周后脚本突然运行成功,我也不确定是哪一步导致pypinyin包配置成功,因此将心得体会写出来,如果过一段时间,打开10.2的机器运行脚本成功了,再写后续.......,按照“配置方法1:”进行尝试,显示配置失败。

2301_77413856的博客 1295

初识YUV,实战NV21格式数据转换为Bitmap

初识YUV,并使用YUV数据生成Bitmap图像一、初识YUV二、采样方式2.1、YUV 4:4:42.2、YUV 4:2:22.2、YUV 4:2:2 一、初识YUV 说到YUV我们就必须先从RGB说起了,如下图所示,请各位把每个色块当成一个像素点。通常一个像素点由RGB(Alpha我们先不考虑)三原色组成。 如下图中第一个像素点,其RGB值分别为(236,102,93),而这三个值就组成了我们看到的 红色 。 然而上图中除了RGB值外,我还标出了每个像素点的YUV的值,YUV的值是怎么来的呢?直接给公

乐翁龙 7125

BST二叉搜索树

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

超级博客 1202

同花顺自动化交易避坑指南:pywinauto实战中验证码识别与界面弹窗处理

本文深入探讨同花顺自动化交易中的关键稳定性问题,重点解决验证码识别与弹窗处理两大难题。通过优化Tesseract OCR、整合打码平台API以及设计pywinauto弹窗监控体系,提供了一套完整的自动化交易解决方案,帮助交易者有效规避资金账户和持仓信息操作中的常见陷阱。

weixin_33734785的博客 486

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

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

A.的博客 1818

LabVIEW内存优化实战:用DVR和队列高效处理大型数组,告别数据副本

本文深入探讨LabVIEW内存优化技术,重点介绍数据值引用(DVR)和单元素队列(SEQs)在高效处理大型数组中的应用。通过对比传统方法与现代引用技术的性能差异,提供减少内存副本、提升程序效率的实战方案,帮助开发者在测试测量、图像处理等数据密集型场景中实现显著性能提升。

weixin_30835649的博客 1061

Python爬虫实战:使用Scrapy+Playwright高效爬取全球专利数据库

本文将详细介绍如何使用Python最新技术栈(Scrapy+Playwright)构建一个高效的专利数据库爬虫系统。我们将从爬虫基础知识讲起,逐步深入到反爬应对策略、分布式爬虫架构以及数据存储方案,最终实现一个完整的专利数据采集系统。专利数据是技术创新领域的重要信息资源,包含技术描述、权利要求、申请人信息等宝贵数据。中国国家知识产权局(CNIPA)美国专利商标局(USPTO)欧洲专利局(EPO)世界知识产权组织(WIPO)

2201_76125261的博客 1382

二叉搜索树BST的学习

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

weixin_52055811的博客 864

飞书接入OpenClaw:从零到一的保姆级图文教程

本文主要介绍了飞书接入OpenClaw:从零到一的保姆级图文教程,希望能对学习使用OpenClaw 的同学们有所帮助。 文章目录 1. 背景 2. 解决方案 2.1 步骤一:安装插件 2.2 步骤二:创建机器人应用 2.3 步骤三:测试 3. 注意事项

weixin_43178406的博客 13万+

BST 二叉搜索树

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

Yan__Ran的博客 822

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

二叉搜索树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

NTscan扫描工具

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

Python实现二叉搜索树BST

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

神不烦 2338

算法 {二叉搜索树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、付费专栏及课程。

余额充值