马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
我根据数据结构与算法#整理 - 庖丁解牛中的代码,完成了一个二叉排序树的插入和查找算法。
但是,我发现插入算法有问题:只能插入一个,如果再次插入会将前一个覆盖。#include <stdio.h>
#include <stdlib.h>
#define FALSE 0
#define TRUE 1
typedef struct BiTNode
{
int data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
int SearchBST(BiTree T, BiTree f, int key, BiTree *p);
int InsertBST(BiTree *T, int key);
/*
1.递归遍历二叉树,有没有key
2.如果有,则返回TRUE,并令p指向找到的结点。
3.如果没有,则返回FALSE,并令p指向查找路径上失败结点的父结点
4.如果T为空,那么返回FALSE,并令p指向T。
@param1:T是二叉树。
@param2:f为T的双亲结点指针,初始为NULL。
@param3:key为待查结点的data值。
@param4:p是查找指针,执行查找过程。
注意:由于f、p、s都要接收或者链接T,所以类型必须一致都为BiTree
*/
int SearchBST(BiTree T, BiTree f, int key, BiTree *p)
{
if(!T)//查找不成功
{
*p = T;
return FALSE;
}
else if(T->data == key) //查找成功
{
*p = T;
return TRUE;
}
else if(T->data > key)
{
SearchBST(T->lchild, T, key, p); //p内存放的是外部实参p的地址
}
else if(T->data < key)
{
SearchBST(T->rchild, T, key, p);
}
}
/*
二叉排序树的插入:
1.首先判断:二叉排序树中有没有相应结点。如果有:返回FALSE;如果没有,申请空间存放key并将其插入到失败结点的父结点之后。
2.其次判断:二叉排序树是否为空(可用p来判断),若为空,则令新结点作为根结点。
*/
int InsertBST(BiTree *T, int key)
{
BiTree s, p;
if(!SearchBST(*T, NULL, key, &p)) //如果没有该结点
{
s = (BiTree)malloc(sizeof(BiTNode));
s->data = key;
s->lchild = NULL;
s->rchild = NULL;
if(!p) //p为空结点时:树为空树
{
*T = s;
}
else if(key > p->data)
{
p->rchild = s;
}
else
{
p->lchild = s;
}
return TRUE;
}
else //如果节点存在
{
return FALSE;
}
}
int main(void)
{
BiTree T;
BiTree p;
int key, ch;
T = NULL;
p = NULL;
printf("操作指南:\n");
printf("1,代表插入\n");
printf("2,代表查找\n");
printf("0,代表结束\n");
printf("请输入操作指令:");
scanf("%d", &ch);
while(ch)
{
switch(ch)
{
case 1:
printf("请输入待插入的值:");
scanf("%d", &key);
if(InsertBST(&T, key))
{
printf("插入成功!\n");
}
else
{
printf("插入失败!\n");
}
break;
case 2:
printf("请输入待查找的值:");
scanf("%d", &key);
if(SearchBST(T, NULL, key, &p))
{
printf("查找%d成功\n", p->data);
}
else
{
printf("查找%d失败\n", key);
}
break;
default:
break;
}
printf("请输入操作指令:");
scanf("%d", &ch);
}
return 0;
}
|