二叉排序树的删除操作
算法思想
二叉排序树,删除操作主要针对三种情况。
1 叶子节点-直接删除就可以了
2 没有左孩子的节点-直接嫁接右子树就可以了(没有右孩子的节点-直接嫁接左子树就可以了)
3 如果左右子树都存在,则寻找删除节点的直接前驱(即左子树里面的最右的节点)
编程时需要注意,函数时针对指针的操作,因此为了修改指针,要使用二级指针传参才可以
例如:
void delete(BinaryTree **b){ .... } int main(){ BinaryTree *b = (BinaryTree *)malloc(sizeof(BinaryTree)); delete(&b); }
函数代码:
bool deleteTree(BTree **b,int key){ if(!*b) return false; else{ if((*b)->data == key){ return deleteNode(&(*b)); } else if((*b)->data > key) return deleteTree(&(*b)->lchild,key); else return deleteTree(&(*b)->rchild,key); } } bool deleteNode(BTree **b){ BTree *p,*s; if((*b)->lchild == NULL ){ p = (*b); (*b) = (*b)->rchild; free(p); }else if((*b)->rchild == NULL){ p = (*b); (*b) = (*b)->lchild; free(p); }else{ p = (*b); s = (*b)->lchild; while(s->rchild != NULL){ p = s; s = s->rchild; } (*b)->data = s->data; if(p != (*b)) p->rchild = s->lchild; else p->lchild = s->lchild; free(s); return true; } }
全部代码:

1 #include <stdio.h> 2 #include <stdlib.h> 3 typedef struct bTree{ 4 int data; 5 struct bTree *lchild,*rchild; 6 }BTree; 7 8 void initialTree(BTree *b); 9 bool insertTree(BTree *b,int key); 10 int searchTree(BTree *b,int key,BTree *f,BTree *&p); 11 void InOrderTree(BTree *b); 12 bool deleteTree(BTree **b,int key); 13 bool deleteNode(BTree **b); 14 15 int main(){ 16 BTree *b = (BTree *)malloc(sizeof(BTree)); 17 b->data = 5; 18 b->lchild = b->rchild = NULL; 19 initialTree(b); 20 InOrderTree(b); 21 deleteTree(&b,4); 22 InOrderTree(b); 23 getchar(); 24 return 0; 25 } 26 bool deleteTree(BTree **b,int key){ 27 if(!*b) 28 return false; 29 else{ 30 if((*b)->data == key){ 31 return deleteNode(&(*b)); 32 } 33 else if((*b)->data > key) 34 return deleteTree(&(*b)->lchild,key); 35 else 36 return deleteTree(&(*b)->rchild,key); 37 } 38 } 39 bool deleteNode(BTree **b){ 40 BTree *p,*s; 41 if((*b)->lchild == NULL ){ 42 p = (*b); 43 (*b) = (*b)->rchild; 44 free(p); 45 }else if((*b)->rchild == NULL){ 46 p = (*b); 47 (*b) = (*b)->lchild; 48 free(p); 49 }else{ 50 p = (*b); 51 s = (*b)->lchild; 52 while(s->rchild != NULL){ 53 p = s; 54 s = s->rchild; 55 } 56 (*b)->data = s->data; 57 if(p != (*b)) 58 p->rchild = s->lchild; 59 else 60 p->lchild = s->lchild; 61 free(s); 62 return true; 63 } 64 } 65 void InOrderTree(BTree *b){ 66 if( !b ) 67 return; 68 InOrderTree(b->lchild); 69 printf("%d ",b->data); 70 InOrderTree(b->rchild); 71 } 72 73 void initialTree(BTree *b){ 74 insertTree(b,5); 75 insertTree(b,3); 76 insertTree(b,4); 77 insertTree(b,6); 78 insertTree(b,2); 79 insertTree(b,1); 80 insertTree(b,8); 81 } 82 int searchTree(BTree *b,int key,BTree *f,BTree *&p){ 83 if(!b){ 84 p = f; 85 printf("++%d\n",p->data); 86 return 0; 87 } 88 else if( key == b->data){ 89 p = b; 90 printf("--%d \n",p->data); 91 printf("找到元素key:%d\n",key); 92 return 1; 93 } 94 else if(key > b->data) 95 return searchTree(b->rchild,key,b,p); 96 else 97 return searchTree(b->lchild,key,b,p); 98 } 99 bool insertTree(BTree *b,int key){ 100 BTree *p,*s; 101 if(!searchTree(b,key,NULL,p)){ 102 printf("%d 没有出现在树中,可以插入在%d之后\n",key,p->data); 103 s = (BTree *)malloc(sizeof(BTree)); 104 s->data = key; 105 s->lchild = s->rchild = NULL; 106 if(!b){ 107 b = s; 108 } 109 else if(key < p->data){ 110 p->lchild = s; 111 }else{ 112 p->rchild = s; 113 } 114 return true; 115 }else 116 return false; 117 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
2013-04-09 Apache实现反向代理负载均衡