在树根结点指针为r的二叉查找(排序)树上删除键值为e的结点
来源:互联网 发布:数据生产平台 编辑:程序博客网 时间:2024/03/29 00:48
鲁班软件笔试时的题目,后来搜了下,发现是软设的题。
转自:http://hi.baidu.com/mqgw/blog/item/cade830f1894222c6159f36c.html
转自:http://www.examda.com/soft/Programmer/060124/091040110-2.html
函数DeleteNode(Bitree *r,int e)的功能是:在树根结点指针为r的二叉查找(排序)树上删除键值为e的结点,若删除成功,则函数返回0,否则函数返回-1。二叉查找树结点的类型定义为:
typedef struct Tnode{
int data;
struct Tnode *Lchild,*Rchild;
}*Bitree;
在二叉查找树上删除一个结点时,要考虑三种情况:
1. 若待删除的结点p是叶子结点,则直接删除该结点;
2. 若待删除的结点p只有一个子结点,则将这个子结点与待删除结点的父结点直接连接,然后删除结点p;
3. 若待删除的结点p有两个子结点,则在其左子树上,用中序遍历寻找关键值最大的结点s,用结点s的值代替结点p的值,然后删除结点s,结点s必属于上述○1、○2情况之一。
int DeleteNode(Bitree *r,int e) {
Bitree p = *r, pp, s, c;
while (p&&p->data !=e)
{ /*从树根结点出发查找键值为e的结点*/
pp = p;
if ( e< p->data)
p = p -> Lchild;
else
p = p->Rchild;
}
if (!p) return –1; /* 查找失败 */
if (p->Lchild && p->Rchild)
{ /* 处理情况3 */
s = p->Lchild;
pp = p;
while (s->Rchild)
{
pp = s;
s = s-> Rchild;
}
p->data = s ->data;
p = s;
}
/* 处理情况○1、○2*/
if (p->Lchild )
c = p -> Lchild;
else
c = p -> Rchild;
if (p == *r)
*r = c;
else
if (p==pp->Lchild )
pp -> Lchild = c;
else
pp->Rchild = c;
free(p);
return 0;
}
- 在树根结点指针为r的二叉查找(排序)树上删除键值为e的结点
- 删除二叉树中度为0的结点(即叶子结点)
- 树根结点到r所指结点之间的路径
- 二叉树根结点到任意结点的路径
- 打印二叉树根结点到所有叶子结点的路径
- 删除二叉树中的度数为1的所有结点
- 二叉树中查找值为x的结点,打印x结点的全部祖先
- 在二叉树t中查找值为x的结点
- 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
- 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
- 递归在单链表中查找某个值为data的结点
- 求出一个排序二叉树中结点度数为一的结点个数
- 在二叉树中找值为x的结点(假设所有结点的值都不一样)
- 在二叉树中找值为x的结点(假设所有结点的值都不一样)
- 项目一--删除结点值为X的结点
- 假设在长度大于1的循环链表中,即无头结点也无头指针,s为指向链表中的某个结点的指针,试编写算法删除结点s的前驱结点
- 二叉树的祖先结点,删除,插入,查找,前驱结点,后继结点等
- 关于对象和对象指针,涉及指向链表首结点和二叉树根结点的头指针——传指针还是传指针的指针?
- android 环境搭建
- Java多线程编程总结
- 海量数据面试题整理
- hadoop源码走读
- 求字符串中字母出现的次数并排序输出
- 在树根结点指针为r的二叉查找(排序)树上删除键值为e的结点
- Hibernate缓存机制
- 十道海量数据处理面试题与十个方法大总结
- 商业应用中Java浮点数的精确计算及表示
- Flash Builder 4.5 和MyEclipse 集成
- yum repository设置
- sql去掉重复项
- [转贴]String类
- android调用平台功能