Linux学习笔记(算法与数据结构)之 二叉搜索树代码(C语言)

Linux C 数据结构——二叉树 一、树的概念       树(tree)是n(n>=0)个节点的有限集合T,它满足两个条件: 1)有且仅有一个特定的称为根(root)的节点; 2)其余的节点可以分为m(m>=0)个互不相交的有限结合T1、T2、...、Tm,其中每一个集合又是一棵树,并成为其根的子数(Subtree)。      树的逻辑结构:树中任何节点都可以有零个或多个直接后继节点(子节点),但至多只有一个直接前 阅读详情

1、代码在VS2010的C++编译器中编译通过,可能有极少部分语法不符合C99标准;bool类型无法使用,用int代替

2、由于VS配置问题,没有分.c和.h文件书写;如果要分,最好将Create_Node和Destory_Node加上static关键字修饰,他们只会在所属的.c文件中使用。

3、用C实现需要用到二级指针...比较繁琐,C++中可以用引用代替。

4、国庆放假了,等会赶火车回家...实在没想到二叉搜索树写了一个下午...所以二叉搜索树的大小size和高度heigth没有加入到代码实现中;批量删除某个数的功能也没有实现;释放内存的Deinit也没有实现...

 

// Cpp_Study.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>

/*
 *******************************************************************
 结构体:表示二叉搜索树上的一个节点,包含3个成员变量
 *******************************************************************
*/
typedef struct BsTree_Node {
	int data;				//该节点存储的数据
	BsTree_Node* left;		//该节点的左子节点
	BsTree_Node* right;		//该节点的左子节点
}	BSTREE_NODE;

/*
 *******************************************************************
 结构体:表示二叉搜索树(或者说二叉搜索树的第0层)
 *******************************************************************
*/
typedef struct BsTree {
	BSTREE_NODE* root;		//记录树的根节点
}	BSTREE;


/*
 *******************************************************************
 函数功能:根据参数data创建新的节点存储data的值,返回新创建的节点的地址
 *******************************************************************
*/
static BSTREE_NODE* Create_Node(int data)
{
	BSTREE_NODE* bstree_node = (BSTREE_NODE*)malloc(sizeof(BSTREE_NODE));	//为新节点申请空间
	bstree_node->data = data;		//赋初值
	bstree_node->left = NULL;
	bstree_node->right =NULL;
	return bstree_node;
}

/*
 *******************************************************************
 函数功能:在以一个以root为根的子树中,插入新节点new_node
 形参BSTREE_NODE** root,代表存储在根节点中存储左子节点地址的内存空间的地址
 *******************************************************************
*/
static void Insert(BSTREE_NODE* new_node,BSTREE_NODE** root)
{
	if (*root == NULL)			//如果要插入的地方本身为空,则插在此处;并将父亲节点的左节点指针指向new_node
	{
		*root = new_node;
		return ;
	}
	else if (new_node != NULL)		
	{
		if (new_node->data <= (*root)->data)	//小于等于父节点的值则往左走
			Insert(new_node,&(*root)->left);
		else
			Insert(new_node,&(*root)->right);	//大于父节点的值则往左走
	}
}

/*
 *******************************************************************
 函数功能:在以一个以root的子节点为根的子树中,寻找data值,返回找到的data值所在的节点地址
 形参BSTREE_NODE** root,代表存储在根节点中存储左子节点地址的内存空间的地址
 *******************************************************************
*/
static BSTREE_NODE** Find(int data,BSTREE_NODE** root)
{
	if ((*root) == NULL)		//如果父亲节点指向正在搜索的节点的指针为空,代表该指针不存在
								//即已经搜索到最后一层,则返回NULL代表未找到
		return NULL;
	if ((*root)->data > data)	//要寻找的值小于该节点的值,左走
		return Find(data,&(*root)->left);
	if ((*root)->data < data)	//要寻找的值大于该节点的值,右走
		return Find(data,&(*root)->right);
	return root;				//要寻找的值等于该节点的值,返回该节点地址
}

/*
 *******************************************************************
 函数功能:中序遍历二叉搜索树
 *******************************************************************
*/
static void traval(BSTREE_NODE* bstree_node)
{
	if (bstree_node == NULL) return ;
	traval(bstree_node->left);
	printf("%d ",bstree_node->data);
	traval(bstree_node->right);
}

/*
 *******************************************************************
 函数功能:初始化一个二叉搜索树,主要是赋值
 *******************************************************************
*/
void BsTree_Init(BSTREE* bstree)
{
	bstree->root = NULL;
	bstree->root = 0;
}

/*
 *******************************************************************
 函数功能:在二叉搜索树中,插入新值data。通过调用内部接口函数实现
 *******************************************************************
*/
void BsTree_Insert(BSTREE* bstree,int data) {
	Insert(Create_Node(data),&bstree->root);
}	

/*
 *******************************************************************
 函数功能:在二叉搜索树中,删除一个值为data的节点
 需要调用内部接口函数find寻找该值所在节点的地址
 找到之后,将该节点的左子树加入到右子树中,用右子树根节点代替该节点即可
 *******************************************************************
*/
void Bstree_erase(BSTREE* bstree,int data)
{
	BSTREE_NODE** root = Find(data,&bstree->root);
	if (! *root) return ;
	Insert((*root)->left,&(*root)->right);
	BSTREE_NODE* tmp = (*root);
	(*root) = (*root)->right;
	(*root)->left = NULL;
	free(tmp);
}

/*
 *******************************************************************
 函数功能:将一个数改为另一个数
 *******************************************************************
*/
void BsTree_update(BSTREE* bstree,int oldData,int newData)
{
	BSTREE_NODE ** tmp = Find(oldData,&(bstree->root));
	if (tmp == NULL) return ;
	(*tmp)->data = newData;
}

/*
 *******************************************************************
 函数功能:查询一个树是否存在于二叉搜索树中
 *******************************************************************
*/
void BsTree_exist(BSTREE* bstree,int data)
{
	BSTREE_NODE** tmp = Find(data,&(bstree->root));
	if (tmp != NULL)
		printf("\n%d exist!\n",data);
	else printf("\n%d do not exist!\n",data);
}
/*
 *******************************************************************
 函数功能:中序遍历二叉树,调用内部接口函数travel
 *******************************************************************
*/
void BsTree_traval(BSTREE* bstree)
{
	printf("\n");
	traval(bstree->root);
	printf("\n");
}
/*
 *******************************************************************
 函数功能:获取二叉搜索树大小,程序还未实现
 *******************************************************************
*/
int BsTree_Size(BSTREE* bstree);
/*
 *******************************************************************
 函数功能:获取二叉搜索树高度,程序还未实现
 *******************************************************************
*/
int BsTree_Height(BSTREE* bstree);


void main(void){
	BSTREE bstree;
	BsTree_Init(&bstree);
	while(1)
	{
		printf("\nplease input the number of operation:\n1.Insert 2.update 3.traval 4.exist:");
		int a,b,c;
		scanf("%d",&a);
		if (a == 1)
		{
			scanf("%d",&b);
			BsTree_Insert(&bstree,b);
		}
		else if (a == 2)
		{
			scanf("%d%d",&b,&c);
			BsTree_update(&bstree,b,c);
		}
		else if (a == 3)
		{
			BsTree_traval(&bstree);
		}
		else if (a == 4)
		{
			scanf("%d",&b);
			BsTree_exist(&bstree,b);
		}
		
	}


}

 

C语言二叉树从入门到精通:数据结构、遍历与二叉搜索树实战 数据结构是计算机科学的核心基础,它定义了数据在计算机中的组织、存储和管理方式,直接影响算法的效率。其中,树形结构因其清晰的层次关系,在表达具有父子或从属关系的数据时尤为高效。二叉树作为树结构中最基本且重要的形式,其每个节点最多有两个子节点的特性,使其成为理解递归和分治思想的绝佳模型。从原理上看,二叉树通过指针链接实现动态存储,支持高效的深度优先(前序、中序、后序)和广度优先(层序)遍历,这些遍历方法是许多复杂算法的基础。其技术价值在于,基于二叉树规则衍生的二叉搜索树(BST),能将查找、插入、删除操作的平均 阅读详情

相关推荐

红黑树(附完整C代码)

版权声明:原创不易,转载请注明转自weewqrer 红黑树红黑树简介首先红黑树是一棵二叉搜索树,它在每个结点上增加了一个存储位来表示结点的颜色,可以是RED或者BLACK。通过对一条从根节点到NIL叶节点(指空结点或者下面说的哨兵)的简单路径上各个结点在颜色进行约束,红黑树确保没有一条路径会比其他路径长出2倍,因而是近似平衡的。 用途红黑树和AVL树一样都对插入时间、删除时间和查找时间提供了最好可

weewqrer的博客 2万+

Linux源码搜索,详解二叉搜索树的实现源码

实现二叉搜索树的一种好方法是利用二叉树抽象数据类型。我们以BisTree这个名称来代表二叉搜索树这种数据结构。通过typedef方式将BisTree(二叉搜索树)实现为BiTree(二叉树)的别名。采用typedef方法使得二叉搜索树具有了某种程度的多态能力,如同栈和队列一样。这意味着除了专属于二叉搜索树的操作外,还可以在其上执行属于二叉树的操作。数据结构AvlNode代表树中的结点,AvlNod...

weixin_42116681的博客 266

C 语言 系统编程 + 数据结构实战完整路线

以 Linux C 语言搭建 epoll 高并发多人聊天室,将哈希表数据结构与 Socket 网络编程相结合,实现多客户端同时在线、消息广播、断线自动清理等核心能力,完整展示系统编程与数据结构联合开发思路,附带可直接运行全套源码。

2603_96577204的博客 293

linux BST树算法实现

本文讲述了BST树的基本概念和算法实现,并且提供了示例。

gogo0707的博客 460

Linux内核学习之六--内核数据结构

一、引言 本章会介绍内核中常用的几种数据结构 链表 队列 映射 二叉树 二、数据结构 1、链表 链表中所包含的元素都是动态创建并添加的,在内存中无需使用连续内存区 普通链表:一个一个往下链接 双向链表:拥有两个指针,分别指向上/下一个节点 环形链表:首尾相连 链表代码头文件在<linux/list.h>中,定义为list_head的双向链表,只含有指针,不含有数据,使用时内嵌在我们的结...

文艺小少年的博客 329

微信小程序推送微信服务号模板消息

微信小程序中发送微信服务号模板消息,无需用户手动确认订阅,无需绑定开放平台,无需使用UnionId。

qq_20751269的博客 1556

Linux c 二叉搜索树(节点创建、插入BST)

Linux c 二叉搜索树(节点创建、插入BST)

trb331617的博客 454

SOC设计必看!Tessent DRC检查中最容易踩的5个坑(附解决方案)

本文针对SOC设计中Tessent DRC检查的常见问题,详细分析了5个最易忽视的陷阱,包括时钟域交叉、扫描链虚连、多电压域规则等,并提供专业解决方案。特别针对芯片设计中的DFT验证难点,分享了经过验证的调试方法和Tessent工具使用技巧,帮助工程师提升DRC检查效率。

weixin_29280657的博客 496

linux内核二叉查找树的应用

tsearch(), tfind(), twalk(), and tdelete() manage a binary tree.

春播秋忙 1646

深入解析国家企业征信系统瑞数6vmp算法逆向实战

本文深入解析了国家企业征信系统所采用的双层防护机制,重点聚焦于瑞数6代vmp算法的逆向实战。文章详细拆解了从加速乐521状态码的绕过,到瑞数412挑战的核心算法还原过程,提供了通过动态Hook、日志分析进行算法逆向,并用Python实现自动化请求链的完整技术方案,旨在为安全研究与技术学习提供参考。

yellow的专栏 607

Workbench下列车转向架随机振动疲劳分析

结果中添加功率谱响应工具(Response PSD Tool),可以查看几何体以及远程点上的功率谱密度,如下图11所示,这里查看几何体上某一硬点的加速度功率谱密度响应曲线,如下图12所示。结果中添加疲劳工具(Fatigue Tool),查看列车转向架的疲劳寿命情况,这里采用窄带的寿命假设理论,曝光时间为1s指明计算出的疲劳寿命的基本单位是秒,寿命结果如下图14所示,可以看到最大寿命为1e35s,最小寿命为2.3542e18s,注意单位制,可再次基础上将其转换为小时或天。频域上的统计计算,软件很快计算完成。

ansysxuexizhe的博客 2602

Nuclio 快速上手:用 Docker 一键启动 Dashboard 并部署你的第一个 Serverless 函数

Nuclio 是一个高性能的 Serverless 事件与数据处理平台,本文带你以最快路径体验它:只需要本机装好 Docker,即可一条命令启动 Nuclio Dashboard(图形化界面),在浏览器中创建项目、从内置模板部署函数,并用 `curl` 完成第一次调用。读完本文,你将掌握 Nuclio 在"本地 Docker 模式"下的完整上手流程,同时理解其 Dashboard → 平台抽象 →

gitblog_00575的博客 476

手势控制 Python !Leap Motion Python 开发教程 (二)

手势控制 Python !Leap Motion Python 开发教程 (二) 现在进入正题,我来给大家总结一下我在使用 Leap Motion 开发过程中的经验以及学到的东西,其中我会概括以及翻译官方给出的注释,为了让这些注释更加通俗易懂,让大家更好理解。 回顾 在上一篇文章中我们讲了如何配置 Leap Motion 的 Python 2.7 的开发环境,如果您还没有配置好您的开发环境,可以参...

成畅的博客 3191

印度小哥数据结构视频代码测试笔记

看完发现没看懂,于是就去B站找文中提到的【如果要我说计算机专业最重要的三门课,我会说是《数据结构》、《算法》和《编译原理》。在我看来,能不能理解“递归”像是程序员的第一道门槛,而会不会写编译器则是第二道。我没翻墙,就用了评论里的别人整理的代码,修改了一点小错误,加了缩进,把部分C++代码改写为C代码。看完了咖喱味的数据结构,感觉很有收获,于是决定把视频中的代码也测试下,就有了这篇笔记。代码参考《计算机软件技术基础》徐士良 算法2.29和2.30。核心思想:从队头取出一个节点访问,将节点的子节点加入队尾。

gzc0319的博客 2120

Qt垂直滚动条QVerticalScrollBar详解:从基础到实战的控件开发指南

本文系统解析Qt中QVerticalScrollBar的用法,从基础概念到进阶技巧。主要内容包括:1)基础认知:介绍其继承关系、作用及典型应用场景;2)核心用法:创建方法、关键属性配置和信号槽连接;3)进阶技巧:自定义样式表美化外观,以及与自定义内容区域的联动实现;4)实战注意事项,如避免循环触发和高DPI适配等。文章强调掌握QVerticalScrollBar对提升Qt滚动类功能开发效率的重要性,并建议通过自定义文本编辑器实践巩固知识点。

专注现代C++实战,从核心语法到高性能编程,助力开发者深入掌握系统级编程精髓。 757

Flatten 层的深度理解与运用

Flatten 层的深度理解与运用

你要拥有一个你喜欢并且热爱的人生 7028

DLSS Swapper 快速上手:winget 一键安装,稳妥完成游戏内 DLSS 与 FSR DLL 切换

DLSS Swapper 是一款 Windows 桌面工具,负责下载并替换游戏内置的图像增强 DLL(DLSS、FSR、XeSS)。你可以在游戏不更新的前提下,把游戏里的增强技术版本升上去,或者退回老版本。 ## 先判断:你的游戏是否具备 DLSS 替换条件 这个工具的工作原则是"只换不加"。如果你的游戏本来就带 nvngx_dlss.dll、amd_fidelityfx_dx12.dll、l

gitblog_00249的博客 340

Claude Code 100个真实案例 - 用AI做数据可视化大屏(ECharts+实时数据)

数据报表看着枯燥?领导汇报缺少视觉冲击力?是时候做一个酷炫的数据可视化大屏了!本案例将用 Claude Code 从零搭建一个实时数据可视化大屏,使用 ECharts 实现折线图、柱状图、饼图、地图、仪表盘等多种图表,配合 WebSocket 实现秒级数据刷新,深色主题科技感拉满!

yueyeguzhuo的专栏 196

TDengine 集成 Prometheus:基于 remote_write / remote_read 将监控数据写入时序数据库

Prometheus 是云原生生态中应用最广泛的监控告警系统之一,它通过 `remote_write` 与 `remote_read` 两组标准接口允许外部数据库充当其存储引擎。本文以 TDengine 开源仓库中的官方接入文档为核心,完整讲解如何在 TDengine 中创建存储数据库、在 `prometheus.yml` 中配置 `remote_write`/`remote_read` 地址与

gitblog_00347的博客 417

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C语言新手实战:从零实现二叉树,掌握数据结构与递归核心

数据结构是计算机科学的基础,它研究数据的组织、存储和操作方式。二叉树作为一种非线性数据结构,通过节点和指针的引用关系,实现了层次化的数据组织。其核心原理在于每个节点最多有两个子节点,这种结构天然适合递归处理,能高效实现查找、插入和遍历操作。在技术价值上,二叉树是理解更复杂数据结构(如平衡树、堆)的基石,也是学习递归思想和分治算法的绝佳范例。在应用场景中,二叉搜索树广泛用于数据库索引、文件系统目录组织和编译器语法分析。本文以C语言实现二叉树为例,深入讲解指针操作和内存管理,帮助初学者通过动手实践巩固递归思维,

weixin_34014555的博客 492

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【读书笔记】Linux内核设计与实现--内核数据结构

文章目录1.链表1.1 单向链表和双向链表1.2 环形链表1.3 沿链表移动--线性移动1.4 Linux内核中的实现1.5 操作链表1.6 遍历链表2.队列2.1 kfifo2.2 创建队列2.3 推入队列数据2.4 摘取队列数据2.5 获取队列长度2.6 重置和撤销队列2.7 队列使用举例3.映射3.1 初始化一个idr3.2 分配一个新的UID3.3 查找UID3.4 删除UID3.5 撤销...

wang 恒 的博客 1305

数据结构复杂度分析与OJ实战:C语言算法优化指南

时间复杂度与空间复杂度是算法设计的核心指标,它们通过大O表示法描述输入规模与资源消耗的数学关系。从递归调用栈的空间开销到循环嵌套的时间成本,复杂度分析揭示了程序性能的本质规律。在工程实践中,合理的复杂度控制能显著提升系统吞吐量,特别是在处理大规模数据的搜索、排序等场景时。通过LeetCode等OJ平台的两数之和、反转链表等经典案例,可以直观理解哈希表将查找复杂度从O(n²)降至O(n)的优化价值,以及递归与迭代解法在空间复杂度上的本质差异。掌握这些分析技巧,不仅能提升代码效率,更是通过大厂算法面试的关键能力

weixin_34072637的博客 453

Linux任务调度系统详解与C代码实例

任务调度是指操作系统根据一定的策略和算法,决定哪个任务在何时使用CPU资源的过程。Linux作为一个多任务操作系统,允许多个任务并发执行,任务调度系统负责在这些任务之间进行切换,确保每个任务都能公平地获得CPU资源。Linux任务调度系统是操作系统内核的核心组件之一,负责管理任务的执行顺序和资源分配。本文详细介绍了Linux任务调度的原理、应用场景,并通过代码实例展示了如何使用不同的调度策略。理解Linux任务调度系统的工作原理,对于系统性能优化和开发高效的多任务应用程序具有重要意义。

SEU123WW的博客 878

C语言数据结构实战:从链表到二叉树,手把手实现与调试指南

数据结构是计算机科学中组织与管理数据的核心框架,它定义了数据元素之间的逻辑关系与存储方式,是算法高效运行的基础。其原理在于通过特定的结构(如线性、树形)来优化数据的增删改查操作,从而提升程序性能。掌握数据结构对于深入理解内存管理、培养工程化思维至关重要,尤其在系统编程和性能敏感场景中价值显著。本文聚焦于C语言环境下的数据结构工程实践,通过具体的链表、栈、队列和二叉树实现案例,详细解析了指针操作、内存管理以及递归等关键技术的应用,并提供了针对内存泄漏、指针错误等常见问题的调试技巧,旨在帮助学习者跨越理论到实践

weixin_30905133的博客 406

Linux(内核剖析):17---内核数据结构之二叉树(struct rb_root、struct rb_node)

一、二叉树 一个二叉树是每个节点最多只有两个出边的数 二叉树的内容不是本文重点,不再叙述 二、二叉搜索树 一个二叉搜索树(简称为“BST”)是一个节点有序的二叉树,其顺序通常遵循下列法则: 1.根的左分支节点值都小于根节点值 2.右分支节点值都大于根节点值 3.所有的子树也都是二叉搜索树 因此,一个二叉搜索树所有节点必然都有序,且左子节点小于其父节点值,而右子节点大于其父节...

董哥的黑板报 2766

2、数据结构与算法(C++)

红黑树是一种自平衡二叉搜索树。它在每个节点上增加了一个存储位来表示节点的颜色(红色或黑色),通过对任何一条从根到叶子的路径上各个节点的颜色进行约束,确保没有一条路径会比其他路径长出两倍,从而实现近似平衡。日常开发:直接使用std::map或std::set,无需关心底层红黑树的具体实现。性能需求:如果你需要有序的键值对或集合,且数据量较大,红黑树是实现的最佳选择之一。学习目的:理解红黑树有助于深入掌握 C++ STL 的机制以及平衡树算法。

qq_54441756的博客 222
上一篇: Linux学习笔记(算法与数据结构)之 队列代码(C语言)
下一篇: Linux学习笔记(算法与数据结构)之 环状链表(C语言)
WilliamCode
博客等级 码龄11年 118粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值