二叉搜索树的基本操作(C代码实现)

二叉查找树的查找、删除、插入等基本操作(C语言) 该源码使用C实现了最二叉查找树的基本操作,比如删除、查找,插入等。 立即下载

对于一棵有n个节点的完全二叉搜索树的 基本操作可以实现在O(lgn)的时间内,通常一棵随机建立的二叉搜索树的期望也可以达到O(lgn)。对二叉搜索树来说更有意义的数据是它的高度h,因为以下的操作时间复杂度可以描述为O(h)

这里实现的基本操作有:Search(查找节点), Minimum(最小值), Maximum(最大值), Predecessor(前驱), Successor(后继), Insert(插入节点), Delete(删除节点)。

 他们可以比较高效地实现一个动态集合(dynamic-set)。

根据二叉搜索树的定义理解这些基本操作的算法并不难。

//二叉搜索树基本操作演示 by DaNmarner 2006 7
#include <stdio.h>

typedef 
struct BTType
{
        
struct BTType *lch,*rch,*p;
        
int data;
}
 BTNODE;
typedef BTNODE 
* BITREE;

BITREE BST_Maximum(BITREE x);
BITREE BST_Search (BITREE x,
int a);
BITREE BST_Minimum(BITREE x);
BITREE BST_Successor(BITREE x);
BITREE BST_Predecessor(BITREE x);
void BST_Insert(BITREE *x,BITREE t);
void BST_Delete(BITREE y);
void InorderTreeWalk (BITREE t);
BITREE Creat(
int d);

int main (void)
{
        BITREE root
=NULL;

        printf(
"Displaying Binary Search Tree Operations by DaNmarner 2006 ");
        BST_Insert(
&root,Creat(343));
        BST_Insert(
&root,Creat(3423));
        BST_Insert(
&root,Creat(34233));
        BST_Insert(
&root,Creat(34));
        BST_Insert(
&root,Creat(3));
        printf(
"Inorder Tree Walk [ ");
        InorderTreeWalk(root);
        printf(
"] ");
        printf(
"The prodecessor of data 343 is: %d ",
                BST_Predecessor(BST_Search(root,
343))->data);
        printf(
"The successor of data 343 is: %d ",
                BST_Successor(BST_Search(root,
343))->data);
        printf(
"Maximum of the binary search tree is: %d ",
                BST_Maximum(root)
->data);
        printf(
"Minimum of the binary search tree is: %d ",
                BST_Minimum(root)
->data);
        BST_Delete(BST_Search(root,
343));
        printf(
"Inorder Tree Walk after deleting data 343:[ ");
        InorderTreeWalk(root);
        printf(
"] ");
        system(
"pause");
        
return 0;
}


void InorderTreeWalk (BITREE t) //中序遍历二叉树
{
        
if (t!=NULL) {
                InorderTreeWalk(t
->lch);
                printf(
"%d ",t->data);
                InorderTreeWalk(t
->rch);
        }

}

BITREE BST_Search (BITREE x,
int a) //搜索数据为a的节点
{
        
while (x!=NULL && x->data!=a) x=(a<x->data)?x->lch:x->rch; 
        
return x;
}


BITREE BST_Maximum(BITREE x) 
//求最大值所在节点
{
        
while (x->rch!=NULL) x=x->rch; 
        
return x;
}


BITREE BST_Minimum(BITREE x) 
//求最小值所在节点
{
        
while (x->lch!=NULL) x=x->lch; 
        
return x;
}


BITREE BST_Successor(BITREE x) 
//求节点x的后继
{
        
if (x->rch != NULL) return BST_Minimum(x->rch);
        
else {
                BITREE y
=x->p;
                
while (y!=NULL && x==y->rch){
                        x
=y;
                        y
=y->p;
                }

        
return y;
        }

}


BITREE BST_Predecessor(BITREE x) 
//求节点x的前驱
{
        
if (x->lch != NULL) return BST_Maximum(x->lch);
        
else {
                BITREE y
=x->p;
                
while (y!=NULL && x==y->lch){
                        x
=y;
                        y
=y->p;
                }

                
return y;
        }

}


void BST_Insert(BITREE *x,BITREE t) //在二叉树x中插入节点t
{
        BITREE y
=NULL,p=*x;
        
while (p!=NULL)
        
{
                y
=p;
                p
=(t->data<p->data)?p->lch:p->rch;
        }

        
if(y==NULL) *x=t;
        
else {
                
if (t->data<y->data) y->lch=t;
                
else y->rch=t;
                t
->p=y;
        }

}


void BST_Delete(BITREE y) //删除节点y
{
        
if (y->lch==NULL && y->rch==NULL && y->p) {
                
if(y==(y->p)->lch) (y->p)->lch=NULL;
                
else (y->p)->rch=NULL;
        }
else if (y->rch==NULL && y->p) {
                
if(y==y->p->lch) y->p->lch=y->lch;
                
else y->p->rch=y->lch;
        }
else if (y->lch==NULL && y->p) {
                
if(y==y->p->lch) y->p->lch=y->rch;
                
else y->p->rch=y->rch;
        }
else {
                BITREE t
=BST_Successor(y);
                y
->data=t->data;
                BST_Delete(t);
                y
=t;
        }

        free(y);
}


BITREE Creat(
int d)  //建立节点
{
        BITREE tmp 
= (BITREE)malloc(sizeof(BTNODE));
        tmp
->data = d;
        tmp
->p=tmp->lch=tmp->rch = NULL;
        
return tmp;
}



参考书:算法导论。

二叉树的基本操作,前序遍历,中序遍历,后序遍历,层序遍历 二叉树的基本操作,例如前序遍历,中序遍历,后序遍历及层序遍历 立即下载

相关推荐

数据结构二叉树头文件BiTree.h

数据结构二叉树头文件BiTree.h

树的代码2

已知二叉树采用二叉链表形式存储,设计一个算法完成:对于树中每个元素值为x的结点,删去以它为根的子树,并释放相应的空间。设树B是一棵采用二叉链表形式存储的二叉树,编写一个把树B 中所有结点的左、右子树进行交换的函数。假设二叉树采用二叉链表存储结构,设计一个算法,求二叉树T中值为x的结点的层次号。让出队的序列先放入栈,待所有结点入栈后,输出栈,即可得到反转层次遍历序列。二叉树采用二叉链表存储结构,设计一个非递归算法求二叉树的高度。试写出二叉树的自下而上、从右到左的层次遍历算法。改写后序递归遍历和层序遍历。

weixin_63003502的博客 498

三种方式遍历二叉树(数据结构作业 C++实现)

三种方式遍历二叉树 前序 中序 后序 cpp源文件~

数据结构之树的操作大全

我们事先定义如果树结点的数据域为‘#’时,则这个结点为根节点,没有左右孩子,当然也可以直接把这个结点定义为NULL。 1、树的类型定义 2、三种遍历方式 ①、先序遍历 ②、中序遍历 ③、后序遍历 目录 1、树的类型定义 2、三种遍历方式 ①、先序遍历 ②、中序遍历 ③、后序遍历 ...

small_planet的博客 3574

树(tree)操作代码(中文注释)

大学数据结构课程树操作代码C++(中文注释)..............................................................................................................................

联想Win10改Win7设置BIOS指南

通过本文的指南,你应该能够成功地在联想Win10电脑上设置BIOS以支持Windows 7的安装和运行。尽管Windows 10提供了许多现代化的功能和改进,但如果你因特定需求而更倾向于使用Windows 7,那么本文提供的步骤将帮助你顺利实现这一转换。请记住,在更改操作系统前务必做好充分的准备工作,并在安装过程中保持耐心和细心。祝你安装顺利!

mmoo_python的博客 2036

二叉排序树(二叉查找树、二叉搜索树)(图解+完整代码)

图解二叉排序树(二叉查找树、二叉搜索树)的插入操作、查找操作、删除操作以及完整的代码实现

weixin_54186646的博客 10万+

SAP-ABAP:BAPI_INSPOPER_RECORDRESULTS 记录检验操作结果更新检验批状态详细解析

SAP-ABAP:BAPI_INSPOPER_RECORDRESULTS 记录检验操作结果更新检验批状态详细解析

baidu_35680696的博客 964

二叉搜索树讲解及其C++代码实现

文章概述:本文介绍了二叉搜索树的概念、一般操作和其C++代码实现。不是很了解二叉搜索树请先看教材和讲解然后参照代码自己动手试一试;如果只是需要实现代码&测试代码,请直接查看第四节。参考教材:清华大学《数据结构》第2版教材(殷人昆主编)...

m0_56745306的博客 1336

从零实现深度学习框架——理解正则化(一)

本文介绍解决过拟合与欠拟合的方法——正则化,主要介绍L1和L2正则化。

日积月累,天道酬勤 3394

YOLOv8融合改进 更换检测头为Detect_DyHead同时添加C2f_DBB模块

yolov8独家训练测试融合网络结构,提供详细步骤详细代码,手把手教你在yolov8官方包中把检测头更换为Detect_DyHead检测头,并且将原始的C2f模块更换成C2f_DBB模块,提高检测精度,亲测在多个数据集上有涨点!!!!!

分享一些自己改进代码的实例 4747

二叉树的使用方法

转载: http://blog.jobbole.com/108184/ https://blog.youkuaiyun.com/zhanggonglalala/article/details/79738213 https://blog.youkuaiyun.com/heyanxi0101/article/details/79593542 一、概述 平衡树:所有结点左右子树深度差≤1 排序树:所有结点“左小右大 字典树:由...

qq_30534935的博客 1494

第133章 PCL OrientedBoundingBox 有向包围盒

中文叫有向包围盒,是一种旋转过的包围盒。特点:不像AABB那样固定朝向坐标轴能更紧密地包裹物体适用于复杂姿态的物体,比如倾斜、旋转的物体通常通过PCA、惯性矩等算法确定方向。

yumeiguo的博客 263

二叉搜索树的基本操作

// ConsoleApplication6.cpp: 定义控制台应用程序的入口点。//#include "stdafx.h"#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;struct thetree{ int data; struct thetree *left; struct thetree *right;};thetree *insert(...

i_clearlove的博客 161

【人工智能】AI驱动值班巡检Agent(Hermes)

传统运维值班巡检场景中,存在四大核心痛点:本项目基于 Agent+Skills+浏览器自动化 架构,构建了具备自我进化能力的AI值班员,核心逻辑流如下:

奶爸的编程之路,也就一周冷个三天 177

数控系统(CNC)系列:Hurco VMX42SR_(3).控制系统硬件组成部分

控制箱是CNC系统的核心部分,负责处理所有的控制指令和数据。它通常包含主控板、电源模块、接口板等关键组件。伺服驱动器是CNC系统中的关键组件,负责将主控板发出的控制信号转换为电机所需的驱动电流。它通过闭环控制确保电机的精确运动。电机是CNC系统中的执行机构,负责实现主控板发出的运动指令。常见的电机类型包括步进电机和伺服电机。传感器是CNC系统中的重要组件,用于检测和反馈机床的运行状态。常见的传感器类型包括位置传感器、速度传感器、温度传感器等。电源供应系统为CNC系统的所有组件提供电力。主电源。

2401_87715305的博客 1279

二叉搜索树操作

本文学习的是:二叉搜索(排序)树的普通操作 包括:插入,删除,查找,前序遍历,中序遍历,后序遍历,树的最大深度,最小深度,最大值,最小值和节点个数。 首先需要清楚二叉搜索树的定义: 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、

4只企鹅 1289

TPAMI 2025 | 从缺失碎片到杰作:基于上下文自适应扩散的图像修复

图像修复是一项具有挑战性的任务,尤其是要确保生成的内容与图像的现有部分无缝融合。尽管最近的扩散模型展现出了潜力,但它们在保持已知区域和未知(缺失)区域之间的连贯性方面常常遇到困难。这个问题源于扩散过程中缺乏明确的空间和语义对齐,导致生成的内容无法与原始图像平滑融合。此外,扩散模型通常依赖全局学习分布,而非局部特征,这使得生成的图像部分与现有图像部分之间存在不一致。在这项工作中,作者提出了ConFill,这是一个新颖的框架,引入了上下文自适应差异(CAD)模型,以确保在整个扩散过程中,已知区域和未知区域的中间

小白学视觉 239

C语言实现二叉搜索树的基本操作

简述二叉搜索树二叉搜索树又称二叉排序树,它或者是一棵空树若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树searchTree.htypedef char SearchType; typedef struct SearchNode { SearchType key; // 关键码 ...

Moralin_的博客 504

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

数据结构 - 二叉搜索树基本算法(c语言实现)

二叉搜索树基本算法:查找、删除一个节点、插入、找最大(最小)节点、中序遍历(前序和后序只要换个位置就好了)。 # include &lt;stdio.h&gt; # include &lt;stdlib.h&gt; // 建立节点模型 typedef struct TreeNode { int data; struct TreeNode * left; struct ...

williamgavin的博客 5626

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

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

C实现的二叉搜索树

C实现的二叉搜索树 /**二叉搜索树*/#include<stdlib.h>#include<string.h>#include<malloc.h>#defineTRUE1#defineFALSE0typedefintBOOL;typedefstructNode{structNode*left,*right;...

weixin_34007886的博客 101

二叉树的一些基本操作,c语言实现

#include<stdio.h> #include<stdlib.h> typedef struct node { int data; struct node* left; struct node* right; }Node; typedef struct { Node* root;/* data */ }Tree; void i...

乐酱的博客 285

二叉搜索树

二叉搜索树 定义 二叉搜索树上的基本操作所花费的时间与这棵树的高度成正比,对于有n个结点的一棵完全二叉树来说,这些操作的最坏运行时间为Θ(lgn),然而,如果这棵树是一条n个节点组成的线性链,那么同样的操作就要花费Θ(n)的最坏运行时间,一棵随机构造的二叉搜索树的期望高度为Ο(lgn),因此这样一棵树上的动态集合的基本操作的平均运行时间为Θ(lgn)。 ...

weixin_30363817的博客 193

二叉搜索树——C语言描述——创建,查找,增加,删除结点

二叉搜索树——C语言描述——创建,查找,增加,删除结点

m0_59469991的博客 444

二叉搜索树的一些基本操作

//二叉搜索树 //搜索 struct TreeNode{ int data; struct TreeNode *lchild; struct TreeNode *rchild; }; TreeNode * SearchBST(TreeNode t,keytype key){ if(t==NULL||key==t->data); return t; else if(keydat

NeQrhk 608
上一篇: 再不愿错过——GCC与GDB
下一篇: USACO preface 序言页码 ACed
DaNmarner
博客等级 码龄21年 27粉丝 91原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值