二叉排序树的基本操作(建立,中序遍历,查找,删除,插入)
来源:互联网 发布:js window.history 编辑:程序博客网 时间:2024/05/21 10:50
分析:
二叉排序树的操作的难点在于删除操作,删除操作时,只需要满足二叉排序树的性质即可,即需要找到要删除结点p的左孩子的最右下方的数替代该结点的数据,然后删除p->lchild的最右下方的结点即可。
对于p->lchild==NULL的,只需要让双亲结点直接指向p->rchild即可(对于根节点,只需要改变头指针)。
对于p->lchild没有右子树的,让删除结点左孩子的数据赋值到删除结点上,然后让删除结点的左孩子等于p->lchild->lchild
代码如下:
#include <stdio.h>#include <stdlib.h>typedef struct tree{struct tree *lchild,*rchild;int data;}*BiTree,BiNode;void Insert(BiTree bt,int data){//关键字的插入 BiTree p,s,parent;p=bt;while(p){if(data<p->data){parent=p;p=p->lchild;}else if(data>p->data){parent=p;p=p->rchild;}elsereturn ;}s=(BiTree)malloc(sizeof(BiNode));s->data=data;s->lchild=s->rchild=NULL;if(s->data<parent->data)parent->lchild=s;elseparent->rchild=s;}void InitTree(BiTree &bt,int n){//建立二叉排序树 int data,i;scanf("%d",&data);bt=(BiTree)malloc(sizeof(BiNode));bt->data=data;bt->lchild=bt->rchild=NULL;for(i=1;i<n;i++){scanf("%d",&data);Insert(bt,data);}}void InOrder(BiTree bt){//树的中序遍历 if(!bt)return ;InOrder(bt->lchild);printf("%d ",bt->data);InOrder(bt->rchild);}int Search(BiTree bt,int key){BiTree p;p=bt;while(p){if(key<p->data)p=p->lchild;else if(key>p->data)p=p->rchild;else{printf("数字%d查找成功。\n",key);return 1;}}printf("未找到数据%d。\n",key); return 0;}void Delete_BiTree(BiTree &bt,int key){BiTree p,cur,par;p=bt;while(p){if(key==p->data)break;else if(key<p->data){par=p;p=p->lchild;}else{par=p;p=p->rchild;}}if(!p){printf("该数据不存在.\n");return ;}if(!p->lchild)//没有左子树 {if(p==bt)bt=p->rchild; else if(par->lchild==p)par->lchild=p->rchild;elsepar->rchild=p->rchild;free(p);}else{cur=p->lchild;par=cur;while(cur->rchild){par=cur;cur=cur->rchild;}if(par==p->lchild)//p的左孩子没有右子树 {p->data=par->data;p->lchild=par->lchild;free(par);}else//p的左孩子有右子树 {p->data=cur->data;par->rchild=cur->lchild;free(cur);}}printf("删除成功.\n");}int main(){BiTree bt;int n,key,selet;while(1){printf("------------------\n");printf("1、建立二叉排序树\n");printf("2、输出中序遍历结果\n");printf("3、搜索数据\n");printf("4、删除数据\n");printf("5、插入数据\n");printf("6、退出\n"); printf("------------------\n");scanf("%d",&selet);switch(selet){case 1:printf("输入数字的个数:");scanf("%d",&n);printf("请输入每个数字:");InitTree(bt,n);break;case 2:printf("中序遍历结果为:");InOrder(bt);putchar('\n');break;case 3:printf("请输入查找的关键字:");scanf("%d",&key);Search(bt,key);break;case 4:printf("请输入删除的关键字:");scanf("%d",&key);Delete_BiTree(bt,key);break;case 5:printf("请输入要插入的数据:");scanf("%d",&key); Insert(bt,key);printf("插入成功.\n");break;default:return 0;}}}
0 0
- 二叉排序树的基本操作(建立,中序遍历,查找,删除,插入)
- 二叉排序树的操作(建立、插入、删除和查找)
- 二叉排序树的相关操作(插入,查找,删除,遍历等)
- 二叉查找树的基本操作(建立,插入,删除,遍历)
- 二叉排序树的查找、插入、删除、建立
- 【数据结构树表的查找】二叉排序树详解和代码(生成、插入、查找、最大值、最小值、删除、中序遍历、销毁)
- 二叉排序树,完成创建节点,插入节点,删除节点,查找节点,中序遍历的功能
- 单链表建立,插入,删除,查找,遍历操作
- 单链表建立,插入,删除,查找,遍历操作
- 单链表建立,插入,删除,查找,遍历操作!!!!
- 顺序表的建立、插入、删除、查找、遍历操作
- 二叉排序树的建立、插入、删除、查找、4种遍历 C++完整实现
- java实现二叉排序树的建立,查找,插入,删除
- 二叉排序树的插入、查找、删除、遍历(C语言版)
- 二叉排序树的查找(插入、删除)
- 二叉排序树(插入操作与前、中、后序遍历)
- 链表的基本操作(C语言版):建立,插入,删除,查找,输出
- 二叉排序树的查找、删除、插入
- scanf-printf-simple note
- 南大软院大神养成计划——第十三天
- hdoj 偶数求和
- 123.Oracle数据库SQL开发之 数据库对象——对象创建
- Linux命令学习笔记(1)----cat命令
- 二叉排序树的基本操作(建立,中序遍历,查找,删除,插入)
- leetcode Editdistance
- Mac环境Android 6.0虚拟机启动黑屏解决办法
- 124.Oracle数据库SQL开发之 数据库对象——查看对象类型
- 【读书笔记】:网络安全复习
- Spring Bean组件实现和源码分析
- ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务
- 1022. D进制的A+B (20)
- [MyBatis]MyBatis出现的问题