二叉搜索树C++实现源码

C++二叉搜索树(Binary Search Tree)(附完整源码) 二叉搜索树Binary Search Treenode结构体定义Queue结构体定义二叉搜索树Binary Search Tree算法的完整源码(定义,实现,main函数测试) node结构体定义 struct node { int val; node *left; node *right; }; Queue结构体定义 struct Queue { node *t[100]; int front; int rear; }; 二叉搜索树Binary Sear 阅读详情

二叉搜索树的性质是:对树中的每个结点X,它的左子树的值小于X,它的右子树的值大于X。

 

BinaryTree.h

#include "Utility.h"

//typedef struct TreeNode *PtrToNode;
typedef struct TreeNode *Position;
typedef struct TreeNode *SearchTree;

struct TreeNode
{
	int data;
	TreeNode *left;
	TreeNode *right;
};

SearchTree MakeEmpty( SearchTree T )
{
	if( T != NULL )
	{
		MakeEmpty( T->left );
		MakeEmpty( T->right );
		free(T);
	}
	return NULL;
}

Position Find( int x, SearchTree T )
{
	if( T == NULL )
		return NULL;
	if( x < T->data )
		return Find( x, T->left );
	else if( x > T->data )
		return Find( x, T->right );
	else
		return T;
}

Position FindMin( SearchTree T )
{
	if( T == NULL )
		return NULL;
	else if( T->left == NULL )
		return T;
	else
		return FindMin( T->left );
	//照着FindMax实现非递归的方法
}

Position FindMax( SearchTree T )
{
	if( T != NULL )
		while( T->right != NULL )
			T = T->right;

	return T;
}

SearchTree Insert( int x, SearchTree T )
{
	if( T == NULL )
	{
		T = (TreeNode *)malloc(sizeof(TreeNode));
		if( T == NULL )
			cout << "存储空间不足!" << endl;
		else
		{
			T->data = x;
			T->left = T->right = NULL;
		}
	}else if( x < T->data ){
		T->left = Insert( x, T->left );
	}else if( x > T->data ){
		T->right = Insert( x, T->right );
	}

	return T;
}

SearchTree Delete( int x, SearchTree T )
{
	Position tmp;

	if( T == NULL ){
		cout << "未找到元素!" << endl;
	}else if( x < T->data ){
		T->left = Delete( x, T->left );
	}else if( x > T->data ){
		T->right = Delete( x, T->right );
	}else if( T->left && T->right ){ // x == T->data
		tmp = FindMin( T->right );
		T->data = tmp->data;
		T->right = Delete( T->data, T->right );
	}else{
		tmp = T;
		if( T->left == NULL )
			T = T->right;
		else if( T->right == NULL )
			T = T->left;
		free( tmp );
	}
	return T;
}

void InOrderPrint( SearchTree T )
{
	if( T != NULL )
	{
		InOrderPrint( T->left );
		cout << T->data << " ";
		InOrderPrint( T->right );
	}
}

void PreOrderPrint( SearchTree T )
{
	if( T != NULL )
	{
		cout << T->data << " ";
		PreOrderPrint( T->left );		
		PreOrderPrint( T->right );
	}
}

BinaryTree.cpp

#include "BinaryTree.h"

void main()
{	
	SearchTree T;
	Position P;
	int n = 0;
	int x = 0;

	T = MakeEmpty( NULL );
	cout << "输入二叉树大小:"<< endl;
	cin >> n;
	while( n-- )
	{
		cout << "输入插入结点:";
		cin >> x;
		T = Insert( x, T );
	}

	//for( int i=0; i < n; i++ )
	
	cout << "最大元素:" << FindMax( T )->data << endl;
	cout << "最小元素:" << FindMin( T )->data << endl;

	cout << "中序遍历:";
	InOrderPrint( T );
	cout << endl;

	cout << "前序遍历:";
	PreOrderPrint( T );
	cout << endl;

	/*
	cout << "输入要删除的结点:"<< endl;
	cin >> x;
	//Delete( x, T );
	T = Delete( x, T );
	InOrderPrint( T );
	*/

	system("PAUSE");
}




C++实现二叉搜索树的查找(附完整源码) 二叉搜索树的查找算法: 在二叉搜索树 b 中查找 x 的过程为: 若 b 是空树,则搜索失败,否则: 若 x 等于 b 的根节点的数据域之值,则查找成功;否则: 若 x 小于 b 的根节点的数据域之值,则搜索左子树;否则: 查找右子树 */ // 在根指针 T 所指二叉查找树中递归地查找其关键字等于 key 的数据元素,若查找成功, // 则指针 p 指向該数据元素节点,并返回 TRUE,否则指针指向查找路径上访问的最终 // 一个节点并返回 FALSE,指针 f 指向 T 的双亲,其初始调用值为 NUL 阅读详情

相关推荐

【Office激活】学校正版Office已激活成功仍弹出激活窗口

学校正版Office激活问题:已激活成功仍弹出激活窗口

ESCM_的博客 1万+

【数据结构】二叉搜索树的代码实现(C++)

前言 普通的二叉树的增删查改是没有任何意义的; 所以当我们给树加以一些规则他就会发挥很大的作用; 二叉搜索树的概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值; 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值; 它的左右子树也分别为二叉搜索树; 默认情况下二叉树排序树的数据是不可以有冗余的,相同的数据是不可以再二叉搜索树里; 比如这颗二叉搜索树: 二叉搜索树,又叫搜索二叉树,也叫二叉排序树

呋喃吖的博客 3301

TPC好像是这么回事儿

TPC(Transmit Power Control)发送功率控制,本觉得就是控制一下发送功率,原理很简单,但看原版协议死活每搞懂什么意思,恼羞成怒!!!! 后来又看了一些贴子和cisco的相关功能介绍,再回头看协议,好像是这么一回事: 1、所谓TPC,是AP控制STA的发送功率的一种手段。在802.11d中,已定义了使用Country Element传递区域无线通信规定的信道和最大发送功率信息: 通过获取这些信息,STA可以确定自己应该遵守什么规则,可以用什么发送功率在哪些信道上通信。 2

两只勤劳的蜜蜂 8629

二叉查找树 C++实现(含完整代码)

   一般二叉树的查找是通过遍历整棵二叉树实现,效率较低。二叉查找树是一种特殊的二叉树,可以提高查找的效率。二叉查找树又称为二叉排序树或二叉搜索树。    二叉查找树的定义       二叉排序树(Binary Search Tree)又称二叉排序树(Binary Sort Tree),或者是一颗空二叉树,或者是具有一下特性的二叉树:  若它的左子树不为空,则左子树上的所有结点的值均小于根节点的值...

huangyimo的专栏 5337

EAST算法(Efficient and Accuracy Scene Text))

1.EAST模型简介 本文介绍的文本检测模型EAST,便简化了中间的过程步骤,直接实现端到端文本检测,优雅简洁,检测的准确性和速度都有了进一步的提升。如下图: 其中,(a)、(b)、(c)、(d)是几种常见的文本检测过程,典型的检测过程包括候选框提取、候选框过滤、bouding box回归、候选框合并等阶段,中间过程比较冗长。而(e)即是本文介绍的EAST模型检测过程,从上图可看出,其过程简化为只有FCN阶段(全卷积网络)、NMS阶段(非极大抑制),中间过程大大缩减,而且输出结果支持文本行、单词的多个角度

博客 9579

浅谈MOS管的发热原因和解决办法

解读一下开关管发热原因,解决方案和开关损耗测试。

qq_45508321的博客 1万+

【c++进阶系列】:万字详解二叉搜索树(附源码实现)

想要学会二叉搜索树?看这篇文章就够了!万字详解二叉搜索树

努力努力再努力wz的博客 1134

基于深度学习的番茄成熟度检测系统——YOLOv5、YOLOv8、YOLOv10及UI界面的实现

YOLO是一种快速且准确的目标检测模型,近年来,YOLOv5、YOLOv8和YOLOv10作为YOLO系列的重要版本,分别在速度、精度和效率上进行了优化。下面我们简要介绍这些模型。本文介绍了如何基于YOLOv5、YOLOv8和YOLOv10等深度学习模型,结合PyQt5设计一个番茄成熟度检测系统。通过训练模型、优化算法和设计用户友好的界面,我们能够构建一个高效且准确的番茄成熟度检测系统,广泛应用于农业自动化和智能化管理中。

YOLO 1002

【C++进阶篇】二叉搜索树的实现(赋源码)

二叉搜索树(BST)是一种重要的数据结构,具有动态有序性和高效操作的特点,广泛应用于数据库、编译器、自然语言处理等领域。BST的核心优势在于其支持高效查找、插入和删除操作,平均时间复杂度为O(log n)。通过自平衡技术如红黑树和AVL树,BST能够避免退化为链表,保持高效性能。BST的典型应用包括数据库索引、编译器符号表、动态集合管理等。随着大数据和机器学习的发展,BST在分布式计算和智能算法中的应用前景广阔。未来,BST将继续进化,为海量数据处理和实时系统优化提供更强大的支持。

braveact的博客 1154

YOLO26原创优化:SPPF优化 | 新一代高效可形变卷积DCNv4如何做二次创新?高效结合SPPF

如何跟YOLO26结合:1) SPPF高效结合

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 357

多思计组实验实验三、存储器读写实验

实验三、存储器读写实验

qq_53089329的博客 3651

【C++】模拟实现二叉搜索树(附源码、测试用例)

二叉搜索树,和普通的二叉树不同,它除了拥有链表的快速插入的功能,也拥有比肩数组般快速查找的能力。本文主要模拟实现二叉搜索树的增添、删除、查找以及遍历的功能,编译器环境为VS2019。

qq_74641564的博客 185

【数据集】MODIS 的 MOD07 大气廓线产品概述及下载

MODIS 的 MOD07 大气廓线产品概述及下载

WW、forever的博客 550

【C++进阶】二叉搜索树递归与非递归的模拟实现(附源码)

【C++进阶】二叉搜索树递归与非递归的模拟实现(附源码)

旋律 | 话语 | 色彩 | 情景 396

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【数据结构】二叉搜索树(C++实现)

学习二叉搜索树是为了学习C++容器中map和set做铺垫,通过对二叉搜索树的特性了解,有助于更好的理解map和set的特性,因为map容器是一个模型,而set是一个K(key)模型,它们的实现原理都是一样的。所以,为了减少本文的代码量,我在模拟实现的过程中,会只实现K(key)模型。但两个模型的总体实现代码我会放在最后供大家审阅。在这里给大家解释一下KV模型与KK模型:K模型即只有key作为关键码,结构中只需要存储Key即可,关键码即为需要搜索到的值。给一个单词word,判断该单词是否拼写正确。

weixin_73914025的博客 1103

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

二叉搜索树的应用(C++实现 附源码)

二叉排序树的构建,查找,删除

LS_Alice_0820的博客 459

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C++一步一步实现二叉搜索树

学习《STL源码剖析》关联容器的章节,map,set等关联容器的底层实现都是红黑树,本着循序渐进的思想,先实现二叉搜索树。读懂了二叉搜索树的定义后,实现了二叉搜索树的基本功能。文章属原创,代码全手打,欢迎指正讨论。首先给出类的定义,如下: #include #include #include #include //#include using namespace std; class BST

Enjoy coding 427

红黑树的实现及源码

红黑树是基于二叉搜索树来的,在增加和删除后,增加了颜色平衡调整。 思路可参考: 红黑树与二叉搜索树 c++源码 与 qt图形化显示: 二叉搜索树和红黑树的源码实现 git仓库中: rbTress分支为红黑树实现 master分支为二叉搜索树的实现 以rbTress为准,初步测试没什么大问题,但是没有经过大量测试,并不排除代码中的bug ...

小小东西的博客 282

【C++】二叉搜索树

本篇到这里就结束了,主要讲了二叉搜索树的基本概念以及实现逻辑,希望对大家有所帮助,祝生活愉快,我们下篇再见!

春风不语。 1635

【leetcode】剑指 Offer 36. 二叉搜索树与双向链表

题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 为了让您更好地理解问题,以下面的二叉搜索树为例: 我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。 下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。 特别地,我们希望可以就地完成转换操作。当转...

yyme411的专栏 326

C++:二叉搜索树

如上图需要删除4,我们去寻找4的右子树的最左节点也就是5。一颗树的右子树的最左节点与一颗树的左子树的最右节点,是仅大于该子树的根或仅小于该子树根的节点。比如上图删除6节点,因为6节点的左子树为空,所以我们只需要将6节点的父亲及4节点的right链路6节点的右边,不需要管6是否有又节点。如上图,当我们需要删除4节点的时,因为4拥有左右子树,不能简单直接删除,会破坏二叉搜索树的特性,因此我们需要使用替代法。

2301_80894970的博客 772

C++实现AVL树

C++ 实现AVL树 一、介绍二叉搜索树 ​ 二叉搜索树,就是一种特殊的二叉树,二叉树中每个节点都分为左、右两个子节点。这两个子节点不仅拥有自己的子节点而且还指向自己父节点。下面是代码表示和图示 template<typename T> struct TreeNode { TreeNode(T d,TreeNode* p=nullptr,TreeNode* l=nullptr,TreeNode* r= nullptr):data(d),parent(p),lc(l),rc(r){};

green_healthy的博客 735

数据结构之AVL树

数据结构之AVL树

weixin_47225948的博客 198

C++ 13:AVL树:高效平衡二叉搜索树详解(结尾带源码)

AVL树是一种高度平衡的二叉搜索树,通过控制每个节点的平衡因子(右子树高度减左子树高度)在-1、0、1之间来保证平衡。当插入节点导致平衡因子超出范围时,通过四种旋转操作(右单旋、左单旋、左右双旋、右左双旋)重新平衡树结构。AVL树通过这种机制确保查找、插入等操作的时间复杂度稳定在O(logN)。实现中每个节点包含平衡因子和父指针,便于更新和旋转操作。验证函数检查树的高度差和平衡因子确保正确性。相比普通二叉搜索树,AVL树解决了退化为链表的问题,始终维持高效操作。

L070117的博客 1978

二叉搜索树(二叉排序树)

构造一颗二叉搜索树的过程就是插入过程,找寻要插入元素的位置的规则,将要插入的数据与根节点比较,如果比根节点大,则在右子树中寻找,再将要插入的元素跟右子树的根节点比较,如果大,则继续在右子树中找,反之。二叉搜索树的一个特性,一个节点的所有左子树的值一定比这个节点的值小,一个节点的所有右子树的值比这个节点的值大,所以我们使用中序遍历可以得到一个升序的数组,我们实现的遍历也是利用递归实现中序遍历。7.插入7,由于7小于8,进入左子树3,7又大于3,进入右子树6,7还大于于6,则7为6的右子树。

hhjjjx的博客 2416

剑指Offer(数据结构与算法面试题精讲)C++版——day18

剑指Offer(数据结构与算法面试题精讲)C++版——day18 题目一:所有大于或等于节点的值之和 题目二:二叉搜索树迭代器 题目三:二叉搜索树中两个节点的值之和

weixin_46560512的博客 1002
上一篇: 用链表实现栈C++实现源码
下一篇: 优先队列(堆)C++实现源码
vshadow
博客等级 码龄18年 29粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值