IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 408计算机考研--数据结构--二叉排序树学习(C语言) -> 正文阅读

[数据结构与算法]408计算机考研--数据结构--二叉排序树学习(C语言)

二叉排序树

一、二叉排序树(创建、增删改查)学习

#include<stdio.h>
#include<stdlib.h>

typedef struct BSTNode{
	int key;
	struct BSTNode *lchild,*rchild;
}BSTNode,*BSTree;
//在二叉排序树插入关键字为k的新结点(递归实现),时间复杂度:O(h)-O(n)之间 
int BST_Insert(BSTree &T,int k){
	if(T==NULL){//原树为空,则新插入的结点为根结点 
		T=(BSTree)malloc(sizeof(BSTNode));
		T->key=k;
		T->lchild=T->rchild=NULL;
		return 1;//返回1,插入成功 
	}else if(k==T->key){//树中存在相同的关键字的结点,则插入失败 
		return 0;
	}else if(k<T->key){//插入到T的左子树 
		return BST_Insert(T->lchild,k);
	}else{//插入到T的右子树 
		return BST_Insert(T->rchild,k);
	}
} 
//按照str[] 数组中的关键字序列建立二叉排序树
void Creat_BST(BSTree &T,int str[],int n){
	T=NULL;//初始时T为空树
	int i=0;
	while(i<n){//依次将每个关键字插入到二叉排序树 
		BST_Insert(T,str[i]);
		i++;
	}  
} 
//非递归查找算法1:查找对应结点 
BSTNode *BST_Search1(BSTree T,int key){
	while(T!=NULL&&T->key!=key){//若树空或等于根节点值,则结束查找 
		if(key<T->key){
			T=T->lchild;//小于,在左子树查找 
		}else{
			T=T->rchild;//大于,则在右子树上查找 
		}
	}
	return T;
} 
//非递归查找算法2:查找对应结点的父结点 
BSTNode *BST_Search2(BSTree T,int key){
	while(T!=NULL){//若树空或等于根节点值,则结束查找 
		if(T->lchild!=NULL&&T->lchild->key==key){
			return T;
		}
		if(T->rchild!=NULL&&T->rchild->key==key){
			return T;
		}
		if(key<T->key){
			T=T->lchild;//小于,在左子树查找 
		}else{
			T=T->rchild;//大于,则在右子树上查找 
		}
	}
	return T;
} 
//非递归查找算法3:查找右子树最小结点删除,并将其key返回 
int BST_Search_Del_min(BSTree &T){
	BSTree temp=T;//辅助指针 
	while(temp->lchild!=NULL){//查找到右子树最左结点为止(最小结点) 
		temp=temp->lchild; 
	}
	//删除该结点
	BST_Delete(T,temp->key); 
	return temp->key;
} 
//递归查找算法 
BSTNode *BSTSearch(BSTree T,int key){
	if(T==NULL||T->key==key){
		return T;
	}else if(key<T->key){
		T=BSTSearch(T->lchild,key);
	}else{
		T=BSTSearch(T->rchild,key);
	}
	return T;
} 
//删除结点
bool BST_Delete(BSTree &T,int key){
	BSTree cur=BST_Search1(T,key);//查找当前结点
	BSTree parent=BST_Search2(T,key);//查找当前结点的父结点 
	if(cur==NULL){//没找到该节点 
		return false;
	}else if(cur->lchild==NULL&&cur->rchild==NULL){//叶子结点 
		if(parent==NULL){//该结点为根节点  
			//不做操作,反正最后这个结点要free 
		}else if(parent->lchild!=NULL&&parent->lchild->key=key){//该结点为左子结点 
			parent->lchild=NULL; 
		}else{//该结点为右子结点 
			parent->rchild=NULL; 
		}
		free(cur);
	}else if(cur->rchild==NULL){//只有右子树 
		if(parent==NULL){//该结点为根节点 
			cur=cur->rchild; 
		}else if(parent->lchild!=NULL&&parent->lchild->key=key){//该结点为左子结点 
			parent->lchild=cur->rchild; 
			free(cur);
		}else{//该结点为右子结点 
			parent->rchild=cur->rchild; 
			free(cur);
		}
	}else if(cur->lchild==NULL){//只有左子树 
		if(parent==NULL){//该结点为根节点 
			cur=cur->lchild; 
		}else if(parent->lchild!=NULL&&parent->lchild->key=key){//该结点为左子结点 
			parent->lchild=cur->lchild; 
			free(cur);
		}else{//该结点为右子结点 
			parent->rchild=cur->lchild; 
			free(cur);
		}
	}else{//左右子树都有:查找左子树最大或右子树最小结点,现采用后者,先将删除右子树最小结点,再将原结点填充
		 int min=BST_Search_Del_min(cur->rchild); 
		 cur->key=min;//替换值 
	} 
	return true; 
} 

int main(){
	BSTree t1=(BSTree)malloc(sizeof(BSTNode));
	BSTree t2=(BSTree)malloc(sizeof(BSTNode));
	BSTree t3=(BSTree)malloc(sizeof(BSTNode));
	BSTree t4=(BSTree)malloc(sizeof(BSTNode));
	BSTree t5=(BSTree)malloc(sizeof(BSTNode));
	
	t1->key=2;t1->lchild=t2;t1->rchild=t3;
	t2->key=1;t2->lchild=NULL;t2->rchild=NULL;
	t3->key=4;t3->lchild=t4;t3->rchild=t5;
	t4->key=3;t4->lchild=NULL;t4->rchild=NULL;
	t5->key=5;t5->lchild=NULL;t5->rchild=NULL;
	
	//非递归查找算法测试
	printf("非递归查找算法1结果:%d\n",BST_Search1(t1,3)->key);
	printf("递归查找算法结果:%d\n",BSTSearch(t1,3)->key);
	printf("非递归查找算法2结果:%d\n",BST_Search2(t1,3)->key);
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-10 14:44:49  更:2021-07-10 14:46:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 17:38:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码