*二叉排序树基本操作*
来源:互联网 发布:耕地质量等级数据库 编辑:程序博客网 时间:2024/05/17 02:07
1.存储结构(二叉链表)
#include <stdio.h>#include <stdlib.h>typedef struct bitnode{ int data; struct bitnode *lchild, *rchild;}bitnode, *bitree;
2.二叉排序树查找算法
//递归查找二叉排序树t中是否存在keystatus Search(bitree &t, int key, bitree f, bitree &p)//p指向数据元素的结点 //f指向其双亲结点,其初始调用值为NULL{ if(!t) //若b是空树,则搜索失败 { p = f return 0; } else if(key==t->data)//若查找成功,则指针p指向该数据元素结点,并返回TRUE { p = t; return 1; } else if(key < t->data)//若key小于t的根节点的数据域之值,则搜索左子树 return Search(t->lchild, key, t, p); else return Search(t->rchild, key, t, p);//搜索右子树}
3.二叉排序树的插入算法
(1). 在查找的基础上
// 当二叉排序树T中不存在关键字等于key的数据元素时插入keystatus Insert(bitree &t, int key){ bitree p, s; if(!Search(t, key, NULL, p))//查找不成功 { s = new bitnode; s->data = key; s->lchild = rchild = NULL; if(!p) //若为空树,插入s为根节点 t = s; else if(key < p->data) p->lchild = s; //插入s为左子树 else p->rchild = s; //插入s为右子树 return 1; } else return 0; //树中已有关键字相同的结点,不再插入}
(2). 直接插入法,不需要借助查找关键词
status Insert(bitree &t, int key){ if(t==NULL)//创建一个新的结点 { t=new bitnode; t->lchild=NULL; t->rchild=NULL; t->data=key; } else { if(key < t->data) Insert (t->lchild,key);//插入key为左子树 else Insert (t->rchild,key);//插入key为右子树 }}
4. 二叉排序树的删除算法
二叉排序树的删除可分三种情况讨论:
(1)被删除的结点是叶子, 由于删去叶子结点不破坏整棵树的结构,只需修改其双亲结点的指针即可。
(2)被删除的结点只有左子树或者只有右子树,此时只需要将被删除结点的左子树或者右子树改为其双亲结点的左子树或者右子树即可。
(3)被删除的结点既有左子树,也有右子树,以其前驱替代该结点,再删除该前驱结点。
ps:寻找前驱结点的方法——找到当前结点的左孩子,一直向右遍历,即得当前结点的前驱结点。
//若二叉排序树t中存在关键字等于key的数据元素时,则删除该数据元素结点status Delsearch(bitree &t, int key){ if(!t) //空树肯定不存在等于key的数据元素 return 0; else { if(key == t->data) //找到关键字等于key的数据元素,执行删除操作 return Delete(t); else if(key < t->data) return Delsearch(t->lchild, key);//遍历左子树 else return Delsearch(t->rchild, key);//遍历右子树 }}status Delete(bitree &t)//此时t代表被删结点{ bitree q, s; if(t->rchild == NULL)//右子树空则只需重接待删结点的左子树(待删结点是叶子也走此分支) { q = t; t = t->lchild; free(q); } else if(t->lchild == NULL)//左子树空则只需重接待删结点的右子树(待删结点是叶子也走此分支) { q = t; t = t->rchild; free(q); } else//左右子树均不空 { q = t; s = t->lchild; //转左 while(s->rchild)//向右走到尽头(找到待删结点的前驱结点) { q = s; s = s->rchild; } t->data = s->data;//用被删结点前驱的值取代被删结点的值 if(q!=t) q->rchild = s->lchild; // 重接q的右子树 else q->lchild = s->lchild; // 重接q的左子树 free(s); } return 1;}
0 0
- 二叉排序树的基本操作
- 二叉排序树基本操作详解
- 二叉排序树的基本操作
- 二叉排序树的基本操作
- *二叉排序树基本操作*
- 二叉排序树的基本操作
- 二叉排序树的基本操作
- 二叉排序树的基本操作
- 二叉排序树的基本操作
- 二叉排序树的基本操作测试
- 基于二叉排序树的基本操作
- C++ 二叉排序树基本操作1
- 二叉树基本操作及二叉排序树
- 二叉排序树的基本操作(完整代码)
- 二叉排序树操作
- 数据结构之二叉排序树(基于指针实现基本操作)
- 数据结构之二叉排序树(基于引用实现基本操作)
- 二叉排序树(二叉查找树)的基本操作
- 昨天面试遇见这样一个js 正则表达式题
- VI中的多行删除与复制
- command line
- 高质量代码的命名法则——转载收藏
- oracle split去逗号,行列转换
- *二叉排序树基本操作*
- Android打包签名之后不能使用
- 快速上手JFinal
- Ubuntu下环境变量的设置
- 删除日志文件 空间不释放
- 谈h站与假高权重站的操作与盈利模式
- 在不import某个类的时候,去调运这个类的方法
- oracle服务器 查看存储延迟的trace日志 lgwr
- lightoj-1282-Leading and Trailing【快速幂】(两个数学函数的使用)