二叉排序树插入的非递归算法,,高分求助!!!请大家指点错误!!!

怒码 2012-05-06 06:46:43
#include <stdio.h>
#include <stdlib.h>

#define ENDKEY 0

typedef int KeyType;

typedef struct node
{
KeyType key ;
struct node *lchild,*rchild;
}BSTNode, *BSTree;
int InsertBST(BSTree *bst, KeyType K)
{
BSTree q, s;
s=(BSTree)malloc(sizeof(BSTNode));
s->key=K;
s->lchild = NULL;
s->rchild = NULL;
if ( *bst == NULL )
{
*bst = s;
return 1;
}
q = *bst;
while(q)
{
if(K==q->key) return 0;
if(K<q->key) q = q->lchild;
else q = q->rchild;
}
q = s;

return 1;
}
void CreateBST(BSTree *bst)

{
KeyType key;
*bst=NULL;
scanf("%d", &key);
while (key!=ENDKEY)
{
InsertBST(bst, key);
scanf("%d", &key);
}
}

void PreOrder(BSTree root)
{
if (root!=NULL)
{
printf("%d ",root->key);
PreOrder(root->lchild);
PreOrder(root->rchild);
}
}
void main()
{
BSTree T;
printf("建立二叉排序树,请输入序列:\n");
CreateBST(&T);
printf("先序遍历输出序列为:");
PreOrder(T);
}
...全文
482 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
怒码 2012-05-07
  • 打赏
  • 举报
回复
嗯,在理,谢啦!
angel_su 2012-05-07
  • 打赏
  • 举报
回复
a=5;b=a;然后改b=10,a还是5吧,你的想法应该是用指针BSTree *q才行,代码类似...
	BSTree *q, s;
...

q = bst;
while (*q) {
if (K==(*q)->key)
{
free(s);
return 0;
}
if (K<(*q)->key)
q = &(*q)->lchild;
else
q = &(*q)->rchild;
}
*q = s;
怒码 2012-05-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

循环内把节点粘好吧C/C++ code
while (q) {
p = q;
if (K==q->key)
{
free(s);
return 0;
}
if (K<q->key)
{
q = q->lchild; ……
[/Quote]
高手问题就在这,我的理解是此时的q不就等于p->rchild或p->lchild吗,为什么不能直接用q=s?请指点
angel_su 2012-05-07
  • 打赏
  • 举报
回复
循环内把节点粘好吧
	while (q) {
p = q;
if (K==q->key)
{
free(s);
return 0;
}
if (K<q->key)
{
q = q->lchild;
if (q == NULL)
p->lchild = s;
}
else
{
q = q->rchild;
if (q == NULL)
p->rchild = s;
}
}
...
怒码 2012-05-06
  • 打赏
  • 举报
回复
给大家一个输入序列45,24,53,12,28,90
如果遍历序列为45,24,12,28,53,90
那就对了
大家帮忙找一下错误
怒码 2012-05-06
  • 打赏
  • 举报
回复
各位运行一下就知道了,结果是不正确的
pengbaoxing 2012-05-06
  • 打赏
  • 举报
回复
while(q)
{
if(K==q->key) return 0;
if(K<q->key) q = q->lchild;
else q = q->rchild;
}
q = s;


你这个q=s;后面你没发现少了点什么吗?
s->leftchild=q->leftchild;
s->rightchild=q->rightchild;
Furney 2012-05-06
  • 打赏
  • 举报
回复
目测是没有错误的,是不楼主建树的时候输入有问题
hen_hao_ji 2012-05-06
  • 打赏
  • 举报
回复
运行没错啊
做一门精致,全面详细的 java数据结构与算法!!!让天下没有难学的数据结构,让天下没有难学的算法,不吹不黑,我们的讲师及其敬业,可以看到课程视频,课件,代码的录制撰写,都是在深夜,如此用心,其心可鉴,他不掉头发,谁掉头发???总之你知道的,不知道的,我们都讲,并且持续更新,走过路过,不要错过,不敢说是史上最全的课程,怕违反广告法,总而言之,言而总之,这门课你值得拥有,好吃不贵,对于你知识的渴求,我们管够管饱话不多说,牛不多吹,我们要讲的本门课程内容:稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧