由于输入的数据顺序不同,建立的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)的建立、删除、查找相关推荐

  1. C++二叉搜索树(Binary Search Tree)(附完整源码)

    二叉搜索树Binary Search Tree node结构体定义 Queue结构体定义 二叉搜索树Binary Search Tree算法的完整源码(定义,实现,main函数测试) node结构体定 ...

  2. 实现一个二叉搜索树(Binary Search Tree)

    文章目录 定义 代码实现 一.Github代码地址 二.节点 三.树实现接口 四.4种遍历方式 五.搜索 六.删除 七.插入 结尾 定义 二叉搜索树(Binary Search Tree),又名二叉排 ...

  3. 二叉搜索树(Binary Search Tree)(Java实现)

    文章目录 1.二叉搜索树 1.1. 基本概念 1.2.树的节点(BinaryNode) 1.3.构造器和成员变量 1.3.公共方法(public method) 1.4.比较函数 1.5.contai ...

  4. 数据结构与算法(八)二分搜索树(Binary Search Tree)

    本文主要包括以下内容: 二分搜索树的基本概念 二分搜索树的基本操作 1. 插入 2. 删除 3. 查询 实现二分搜索树 二分搜索树的不足 二分搜索树的基本概念 二分搜索树(英语:Binary Sear ...

  5. 二叉搜索树详解--实现插入和删除

    目录 BST树概念 BST树操作 BST树的查找 BST树的插入 BST树的删除 实现一个自己的BST树 BSTNode类和BSTree类 查找操作; 插入操作: 删除操作: 应用: 二叉搜索树性能分 ...

  6. 平衡搜索树(Binary Search Tree BST)、索引二叉搜索树

    文章目录 二叉搜索树 索引二叉搜索树 测试代码 这里只给出代码实现. 更多的性质日后再补. 二叉搜索树 // // Created by SongyangJi on 2020/12/23. //#if ...

  7. 第七章 二叉搜索树(b3)BST:删除

    转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/10247191.html

  8. go 递归tree关系_Go实现一个二叉搜索树

    什么是二叉搜索树 二叉搜索树(binary search tree,BST[1])也叫排序的二叉树,根节点比左边子树的所有节点都大,比右边子树上的所有节点都小,如下图就是一个二叉搜索树: 要实现一个二 ...

  9. C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划

    C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划 博文末尾支持二维码赞赏哦 _ github 章3 Stack栈 和 队列Queue= ...

  10. 二叉搜索树--基础篇

    二叉搜索树Binary Search Tree(BSTs)又名二叉排序树,二叉查找树.而能够自平衡的叫平衡搜索树,包括AVL trees, 2-3 trees, 2-3-4 trees, B-tree ...

最新文章

  1. Notification 浏览器右下角弹出提示消息
  2. Java中的5种同步辅助类
  3. NS之VGG(Keras):基于Keras的VGG16实现之《复仇者联盟3》灭霸图像风格迁移设计(A Neural Algorithm of Artistic Style)
  4. idea2020 需要热部署吗_小微制造企业需要部署MES系统吗?
  5. 十天冲刺---Day8
  6. 架构 | 聊聊我心中的架构设计观
  7. python判断进程是否存在
  8. Python笔记(1) Python简介
  9. 详解数据中心灾备切换技术
  10. 字符串转化为整型,为0,而不是1
  11. Python 方法调用机制
  12. 游戏服务器系统安装,修复Win10系统游戏服务无法安装错误 0x80073D26(4种方法)...
  13. 关于查询界面渲染问题
  14. 实体机黑苹果安装教程
  15. 基于在线学习行为的评价模型的设计与实现
  16. SSD固态硬盘和HDD机械硬盘的区别
  17. 全媒体运营师胡耀文教你:社群运营这6种裂变模型,你掌握了吗?
  18. 还在抠图?百万张PNG透明图片免费下载!
  19. java 时间轮_基于时间轮的定时任务
  20. 什么是java工具类_常用高效 Java 工具类总结

热门文章

  1. kvm-桥接模式(二)
  2. vue全家桶+Koa2开发笔记(2)--koa2
  3. ETL MySQL in Oracle ODI 12c
  4. [译] 数据可视化教程:基于Google Sheets 和 RStudio Shiny 建立实时仪表盘
  5. Nimbus/Supervisor本地目录结构
  6. haproxy LVS nginx的比较
  7. oracle备份镜像,Oracle RMAN两种备份方式 – 备份集备份与镜像复制备份
  8. hbase 0.96 java api_HBase(九) HBase JAVA API - 运维API
  9. 公共类java连接数据库_JDBC 建立连接公共操作类(静态方式与单例方式)
  10. 接收服务器显示帧控制错误,Websocket连接关闭,出现错误“接收到意外的继续帧”...