博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉排序树的删除操作
阅读量:6622 次
发布时间:2019-06-25

本文共 4180 字,大约阅读时间需要 13 分钟。

算法思想

二叉排序树,删除操作主要针对三种情况。

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 
2 #include
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 }else116 return false;117 }

运行示例:

本文转自博客园xingoo的博客,原文链接:,如需转载请自行联系原博主。
你可能感兴趣的文章
[俗一下]世界500强公司的面试问题与答案提示 [转]
查看>>
使用 Excel Services ,结合 Analysis Services 在 SharePoint 中发布报表
查看>>
SQL Server数据导入导出技术概述与比较
查看>>
format的用法
查看>>
DHCPv6 server port and DHCPv6 client port
查看>>
10个最佳的触控手式的JavaScript框架(转)
查看>>
BitmapFactory.Options避免 内存溢出 OutOfMemoryError的优化方法
查看>>
Python中通过Image的open之后,去show结果打不开bmp图片,无法正常显示图片
查看>>
DNGuard 免费的DotNet加密保护工具 V1.0
查看>>
编程中的命名设计
查看>>
easyui form validate总是返回false原因
查看>>
在(CListView)列表视图中添加右键菜单的方法
查看>>
打SharePoint 2010 SP1后访问用户配置文件同步服务应用程序出错的解决办法
查看>>
推荐《HeadFirst设计模式》
查看>>
Android中的onActivityResult和setResult方法的使用
查看>>
word双栏排版,最后一页由于分节符造成最后一页是空白页,删除分节符双栏就变成了单栏...
查看>>
手机web不同屏幕字体大小高度自适应
查看>>
服务器端口及连接及应用程序间的关系
查看>>
Android监听HOME键的最简单的方法
查看>>
Java 数组
查看>>