|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
- }
复制代码 |
|