二叉搜索树(binary search tree)的建立、删除、查找
由于输入的数据顺序不同,建立的bst会不一样。最坏的情况就是一个链,所以我们引入了平衡二叉树的概念。这里我们先来看binary search tree。(我随笔里面有一些相关知识)
建立(也就是插入)
bstree insert(bstree t,element num){//空树 if(!t){ t=(bstree)malloc(sizeof(binode));t->data=num;t->l=t->r=NULL;}else{if(num<t->data) t->l=insert(t->l,num);else if(num>t->data) t->r=insert(t->r,num); }return t;
}
---------------------------------
建立(非递归版)
bstree insert(bstree t,element num){bstree x=t;bstree y=NULL;//作为num正确位置的父节点 while(x){y=x;if(num<x->data) x=x->l;else if(num>x->data) x=x->r;}//新树 if(!y){t=(bstree)malloc(sizeof(binode));t->l=t->r=NULL;t->data=num;}else if(num<y->data){bstree tep=(bstree)malloc(sizeof(binode));tep->data=num;tep->l=tep->r=NULL;y->l=tep;}else if(num>y->data){bstree tep=(bstree)malloc(sizeof(binode));tep->data=num;tep->l=tep->r=NULL;y->r=tep;}return t;
}
----------------------------------------
删除
bstree deletbstree(bstree t,element x){ptr tep;if(!t){printf("未找到该元素\n");return NULL;}else//首先要找到该元素所在的位置,然后看他有无子树。 {if(x<t->data) t->l=deletbstree(t->l,x);else if(x>t->data) t->r=deletbstree(t->r,x);else//find it's position{if(t->l&&t->r)//左右子树全有。 {tep=findmin(t->r);//这里我们把右子树中最小的元素作为删除节点的代替。t->data=tep->data;t->r=deletbstree(t->r,t->data);//删除最小的元素节点}else{tep=t;//只有右子树,或者没有子树if(!t->l) t=t->r;else t=t->l; //只有左子树。free(tep);} } }return t;
}
----------------------------------------------
查找
bstree bstreesearch(bstree t,element x)
{while(t&&t->data!=x){if(x<t->data) t=t->l;else t=t->r;}if(!t){//上面while的判断必须t在前面,这一步才有效。//因为当找不到元素时,t=null,while第一个判断是t->data,程序错误终止//当第一个判断是t的时候,t=null,自然正常结束程序 printf("没有找到");return NULL;}return t;
}
------------------------------------
全部代码
#include<stdio.h>
#include<stdlib.h>
typedef struct Node* ptr;
typedef int element;
typedef struct Node{ptr l,r;element data;
}binode,*bstree;
//上面定义的是树,下面是队列
typedef struct node* position;
struct node{position next;bstree data;
};
typedef struct Qnode* queue;
struct Qnode{position front,rear;
};
bool isempty(queue q){return (q->front==NULL);
}
queue creatqueue()
{queue q=(queue)malloc(sizeof(struct Qnode));q->front=q->rear=NULL;return q;
}
bool addq(queue q,bstree t)
{position tep=(position)malloc(sizeof(struct node));tep->data=t;tep->next=NULL;if(q->front==NULL){q->front=q->rear=tep;}else{q->rear->next=tep;q->rear=tep;}return true;
}
bstree deletq(queue q){if(isempty(q)) return NULL;bstree tep=q->front->data;position te=q->front;if(q->front==q->rear){q->front=q->rear=NULL;}else{q->front=q->front->next;}free(te);return tep;
}
void disbstree(bstree bt){bstree t;queue q=creatqueue();addq(q,bt);while(!isempty(q)){t=deletq(q);printf("%d ",t->data);if(t->l) addq(q,t->l);
// else printf("#"); if(t->r) addq(q,t->r);
// else printf("#");}
}
bstree insert(bstree t,element num){bstree x=t;bstree y=NULL;//作为num的正确位置 while(x){y=x;if(num<x->data) x=x->l;else if(num>x->data) x=x->r;}//新树 if(!y){t=(bstree)malloc(sizeof(binode));t->l=t->r=NULL;t->data=num;}else if(num<y->data){bstree tep=(bstree)malloc(sizeof(binode));tep->data=num;tep->l=tep->r=NULL;y->l=tep;}else if(num>y->data){bstree tep=(bstree)malloc(sizeof(binode));tep->data=num;tep->l=tep->r=NULL;y->r=tep;}return t;
}
void freebstree(bstree t){if(t){if(t->l) freebstree(t->l);if(t->r) freebstree(t->r);free(t); }
}
ptr findmax(bstree t){while(t->r){t=t->r;}return t;
}
ptr findmin(bstree t){while(t->l){t=t->l;}return t;
}
bstree deletbstree(bstree t,element x){ptr tep;if(!t){printf("未找到该元素\n");return NULL;}else//首先要找到该元素所在的位置,然后看他有无子树。 {if(x<t->data) t->l=deletbstree(t->l,x);else if(x>t->data) t->r=deletbstree(t->r,x);else//find it's position{if(t->l&&t->r)//左右子树全有。 {tep=findmin(t->r);//这里我们把右子树中最小的元素作为删除节点的代替。t->data=tep->data;t->r=deletbstree(t->r,t->data);//删除最小的元素节点}else{tep=t;//只有右子树,或者没有子树if(!t->l) t=t->r;else t=t->l; free(tep);} } }return t;
}
bstree bstreesearch(bstree t,element x)
{while(t&&t->data!=x){if(x<t->data) t=t->l;else t=t->r;}if(!t){printf("没有找到");return NULL;}return t;
}
int main(void){int n;bstree bt=NULL;while(scanf("%d",&n),n!=-1)//数据输入结束标志,-1 {bt=insert(bt,n);printf("插入successfully\n"); }disbstree(bt);ptr max=findmax(bt);ptr min=findmin(bt);printf("最大的 %d\n",max->data);printf("最小的 %d\n",min->data);printf("请输入要删除节点元素的值\n");element data;scanf("%d",&data);bt=deletbstree(bt,data);printf("删除之后的binary search tree 为\n");disbstree(bt);printf("请输入要查找的元素\n");scanf("%d",&data);ptr tt=bstreesearch(bt,data);if(tt) printf("找到他的位置并打印他的值 %d\n",tt->data);freebstree(bt);
}
二叉搜索树(binary search tree)的建立、删除、查找相关推荐
- C++二叉搜索树(Binary Search Tree)(附完整源码)
二叉搜索树Binary Search Tree node结构体定义 Queue结构体定义 二叉搜索树Binary Search Tree算法的完整源码(定义,实现,main函数测试) node结构体定 ...
- 实现一个二叉搜索树(Binary Search Tree)
文章目录 定义 代码实现 一.Github代码地址 二.节点 三.树实现接口 四.4种遍历方式 五.搜索 六.删除 七.插入 结尾 定义 二叉搜索树(Binary Search Tree),又名二叉排 ...
- 二叉搜索树(Binary Search Tree)(Java实现)
文章目录 1.二叉搜索树 1.1. 基本概念 1.2.树的节点(BinaryNode) 1.3.构造器和成员变量 1.3.公共方法(public method) 1.4.比较函数 1.5.contai ...
- 数据结构与算法(八)二分搜索树(Binary Search Tree)
本文主要包括以下内容: 二分搜索树的基本概念 二分搜索树的基本操作 1. 插入 2. 删除 3. 查询 实现二分搜索树 二分搜索树的不足 二分搜索树的基本概念 二分搜索树(英语:Binary Sear ...
- 二叉搜索树详解--实现插入和删除
目录 BST树概念 BST树操作 BST树的查找 BST树的插入 BST树的删除 实现一个自己的BST树 BSTNode类和BSTree类 查找操作; 插入操作: 删除操作: 应用: 二叉搜索树性能分 ...
- 平衡搜索树(Binary Search Tree BST)、索引二叉搜索树
文章目录 二叉搜索树 索引二叉搜索树 测试代码 这里只给出代码实现. 更多的性质日后再补. 二叉搜索树 // // Created by SongyangJi on 2020/12/23. //#if ...
- 第七章 二叉搜索树(b3)BST:删除
转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/10247191.html
- go 递归tree关系_Go实现一个二叉搜索树
什么是二叉搜索树 二叉搜索树(binary search tree,BST[1])也叫排序的二叉树,根节点比左边子树的所有节点都大,比右边子树上的所有节点都小,如下图就是一个二叉搜索树: 要实现一个二 ...
- C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划
C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划 博文末尾支持二维码赞赏哦 _ github 章3 Stack栈 和 队列Queue= ...
- 二叉搜索树--基础篇
二叉搜索树Binary Search Tree(BSTs)又名二叉排序树,二叉查找树.而能够自平衡的叫平衡搜索树,包括AVL trees, 2-3 trees, 2-3-4 trees, B-tree ...
最新文章
- Notification 浏览器右下角弹出提示消息
- Java中的5种同步辅助类
- NS之VGG(Keras):基于Keras的VGG16实现之《复仇者联盟3》灭霸图像风格迁移设计(A Neural Algorithm of Artistic Style)
- idea2020 需要热部署吗_小微制造企业需要部署MES系统吗?
- 十天冲刺---Day8
- 架构 | 聊聊我心中的架构设计观
- python判断进程是否存在
- Python笔记(1) Python简介
- 详解数据中心灾备切换技术
- 字符串转化为整型,为0,而不是1
- Python 方法调用机制
- 游戏服务器系统安装,修复Win10系统游戏服务无法安装错误 0x80073D26(4种方法)...
- 关于查询界面渲染问题
- 实体机黑苹果安装教程
- 基于在线学习行为的评价模型的设计与实现
- SSD固态硬盘和HDD机械硬盘的区别
- 全媒体运营师胡耀文教你:社群运营这6种裂变模型,你掌握了吗?
- 还在抠图?百万张PNG透明图片免费下载!
- java 时间轮_基于时间轮的定时任务
- 什么是java工具类_常用高效 Java 工具类总结
热门文章
- kvm-桥接模式(二)
- vue全家桶+Koa2开发笔记(2)--koa2
- ETL MySQL in Oracle ODI 12c
- [译] 数据可视化教程:基于Google Sheets 和 RStudio Shiny 建立实时仪表盘
- Nimbus/Supervisor本地目录结构
- haproxy LVS nginx的比较
- oracle备份镜像,Oracle RMAN两种备份方式 – 备份集备份与镜像复制备份
- hbase 0.96 java api_HBase(九) HBase JAVA API - 运维API
- 公共类java连接数据库_JDBC 建立连接公共操作类(静态方式与单例方式)
- 接收服务器显示帧控制错误,Websocket连接关闭,出现错误“接收到意外的继续帧”...