1 //二叉查找树的建立,插入,删除操作
  2 #include<stdio.h>
  3 #include<stdlib.h>
  4
  5 typedef struct bsTree
  6 {
  7     int  k ;
  8     struct bsTree * lchild , * rchild ;
  9 }bstnode , * bstree ;
 10
 11 void create_tree(bstree *T,int k1)
 12 {
 13      (*T) = (bstree)malloc(sizeof(bstnode));
 14      if(!(*T)){
 15         fprintf(stderr , "malloc error!\n");
 16         exit(EXIT_FAILURE) ;
 17      }
 18      (*T)->k = k1 ;
 19      (*T)->lchild = (*T)->rchild = NULL;
 20 }
 21
 22 bstree search(bstree T , int k )  //递归搜寻某个关键字为k 的节点
 23 {
 24     if(!T) return NULL;
 25     if(k == T->k) return T ;
 26     if(k < T->k) return search(T->lchild , k ) ;
 27     if(k > T->k) return search(T->rchild , k ) ;
 28 }
 29
 30 bstnode *itersearch(bstree T , int k ) //非递归搜寻某个关键字为k 的节点
 31 {
 32     while(T){
 33         if(k == T->k) return T ;
 34         if(k < T->k) T = T->lchild  ;
 35         else T = T->rchild ;
 36     }
 37     return NULL;
 38 }
 39
 40 bstree modifiedSearch(bstree T , int k1 ) //改进的搜寻 返回要insert的位置的上一个节点,用于插入操作
 41 {
 42     bstree pre  = T ;
 43     while(T){
 44         if(k1 == T->k) return T ;
 45         pre = T ;
 46         if(k1 < T->k) T = T->lchild  ;
 47         else T = T->rchild ;
 48     }
 49     return pre;
 50 }
 51
 52 bstree modifiedSearch2(bstree T , int k1 ) //改进的搜寻 返回要insert的位置的上一个节点 用于删除操作
 53 {
 54     bstree pre  = T ;
 55     while(T){
 56         if(k1 == T->k) return pre ;
 57         pre = T ;
 58         if(k1 < T->k) T = T->lchild  ;
 59         else T = T->rchild ;
 60     }
 61     return NULL;
 62 }
 63
 64 void insert(bstree T , bstree * tmp ,int k1 ) //插入操作  要用到modifiedSearch()函数
 65 {
 66     bstree ptr ;
 67       (*tmp) = modifiedSearch(T,k1);
 68     if( *tmp ){
 69         ptr = (bstree)malloc(sizeof(bstnode)) ;
 70         ptr->k = k1 ;
 71         ptr->lchild = ptr->rchild  = NULL ;
 72             if(k1 < (*tmp)->k) (*tmp)->lchild = ptr ;
 73             else (*tmp)->rchild = ptr ;
 74             }
 75 }
 76
 77 void in_order_traverse(bstree T) // 中序遍历 查找树
 78 {
 79     if(T){
 80
 81         in_order_traverse(T->lchild) ;
 82         printf("%d ",T->k) ;
 83         in_order_traverse(T->rchild) ;
 84     }
 85 }
 86
 87 bstree remove1( bstree T , int k1)
 88 {
 89     int f ;bstree Rf  = T,R  = NULL;
 90      Rf = modifiedSearch2(T,k1) ;
 91      if(k1 > Rf->k ) {
 92         f = 1 ; R = Rf->rchild ;
 93      }else{
 94         f = 0 ; R = Rf->lchild ;
 95      }
 96
 97     if(!R->lchild && !R->rchild){
 98         if(f) Rf->rchild = NULL ;else Rf->lchild = NULL ;
 99     }
100     else if(R->lchild || R->rchild ){
101                 if(f) Rf->rchild = NULL ;else Rf->lchild = NULL ;
102     }
103     else {
104         bstree tmp  = R;
105         while( tmp->lchild)
106             tmp = R->lchild ;
107     R->k = tmp->k ;
108     R->lchild = NULL ;
109     }
110     return R ;
111 }
112
113 int main()
114 {
115     bstree T ;
116     int i ;
117     create_tree(&T , 30) ;
118         bstree tmp ;
119        tmp = (bstree)malloc(sizeof(bstnode)) ;
120        insert(T , &tmp ,5) ;
121     bstree tmp1 ;
122        tmp1 = (bstree)malloc(sizeof(bstnode)) ;
123        insert(T , &tmp1 ,40) ;
124        bstree tmp2 ;
125        tmp2 = (bstree)malloc(sizeof(bstnode)) ;
126        insert(T , &tmp2 ,35) ;
127        bstree tmp3 ;
128        tmp3 = (bstree)malloc(sizeof(bstnode)) ;
129        insert(T , &tmp2 ,45) ;
130        remove1(T,40);
131     in_order_traverse(T);
132     return 0 ;
133 }

转载于:https://www.cnblogs.com/shaughn/p/3487930.html

.7 二叉查找树的 建立 insert search remove 操作相关推荐

  1. openlayers中使用rBush(R树)来存放要素等信息,本文修改了一点其中的rbush源码中的demo,使用canvas画出了insert和delete操作(建立树和删除树中数据)

    openlayers中使用rBush(R树)来存放要素等信息,本文修改了一点其中的rbush源码中的demo,使用canvas画出了insert和delete操作(建立树和删除树中数据) 修改后的源代 ...

  2. 【java】在分页查询结果中对最后的结果集List进行操作add()或remove()操作,报错:java.lang.UnsupportedOperationException...

    场景: 在分页查询结果中对最后的结果集List进行操作add()或remove()操作,报错:java.lang.UnsupportedOperationException 错误: java.lang ...

  3. 031 Rust死灵书之Vec实现insert和remove

    介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source 详 ...

  4. 详解二叉排序树(二叉搜索树、二叉查找树)以及Python实现相关操作

    二叉排序树 引言 1.定义 2.性质 3.操作 3.1 查找 3.2 插入 3.3 生成 3.4 删除 引言 如何更加高效的完成对数据的查询和添加操作,例如↓↓↓ 给你一个数列 (7, 3, 10, ...

  5. mysql insert or replace_mysql 操作总结 INSERT和REPLACE

    言外之意,就是对数据进行修改.在标准的SQL中有3个语句,它们是INSERT.UPDATE以及DELETE.在MySQL中又多了一个REPLACE语句,因此,本文以MySQL为背景来讨论如何使有SQL ...

  6. 二叉查找树(BST Binary Search Tree)

    二叉查找树的特点是什么? 左子树所有的节点都小于父节点,右子树所有的节点都大于父节点.投影到平面以后,就是一个有序的线性表. 二叉查找树既能够实现快速查找,又能够实现快速插入. 但是二叉查找树有一个问 ...

  7. ibatis insert mysql_iBATIS创建操作

    iBATIS创建操作 若要使用iBATIS执行的任何CRUD(创建,写入,更新和删除)操作,需要创建一个的POJO(普通Java对象)类对应的表.本课程介绍的对象,将"模式"的数据 ...

  8. 将数组转换成集合Arrays.asList,不可进行add和remove操作的原因

    直接上代码: import java.util.Arrays; import java.util.List;public class Test {public static void main(Str ...

  9. 中控考勤机 本地mysql_中控考勤机SQL数据库建立方法及常用操作

    释放双眼,带上耳机,听听看~! 首先客户电脑上需要安装sqlserver数据库(2000或者是2005版本) 安装方法就不在这里介绍,下面说一下数据库的建立办法.(以2005版本为例) 1.打开数据库 ...

最新文章

  1. [WCF编程]1.WCF入门示例
  2. banana pi BPI-R1 原理图下载地址:
  3. php开源 饭馆记账软件_GitHub - CNYoki/xxjzWeb: 小歆记账WebApp项目(Web服务端)
  4. jquery常用功能
  5. List集合ArrayList,LinkList
  6. sklearn 中的线性回归、岭回归、Lasso回归参数配置及示例
  7. activemq 延时队列以及不生效问题
  8. html一个页面同时加载多个饼图,Html5饼图绘制实现统计图的方法
  9. 每日一题(31)—— 全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
  10. JSF和Facelets的lifecircle
  11. UVA - 753 A Plug for UNIX(网络流)
  12. 哈工大女孩学计算机毕业转行,2020考生切记,上985读这些专业,据说都是“坑”!...
  13. blob类型对象转为file类型对象
  14. 经典排序算法(八)--选择排序Selection Sort
  15. 土壤重金属含量分布、Cd镉含量、Cr、Pb、Cu、Zn、As和Hg、土壤采样点、土壤类型分布
  16. InstallShield2015创建安装包
  17. 通过JS代码实现Ping功能
  18. Android 手机安装有微信,还是提示未安装微信
  19. 使用阿里云物联网平台IoT Studio控制海康摄像头旋转
  20. 安卓锁屏密码忘记怎么办【超强解锁百分百有效!】

热门文章

  1. 又拍网架构-又一个用到python的网站(转载)
  2. python mongodb 设置密码前一篇ok,csv文件存入mongodb
  3. Spring中的Bean是如何被回收的?
  4. [Java] 蓝桥杯BASIC-13 基础练习 数列排序
  5. 1102. Invert a Binary Tree (25)-PAT甲级真题
  6. 1001. 害死人不偿命的(3n+1)猜想 (15)-PAT乙级真题
  7. 微型计算机基础知识,微型计算机的基础知识
  8. Docker常见命令---简易教程
  9. Java 用HTTP的方式发送JSON报文请求
  10. 最新快手面试题(含总结):设计模式+红黑树+Java锁+Redis等