我的二叉搜索树 C 程序有一个 problem.I am using inorder traversal.only root node printed 为什么?
My binary search tree c program has a problem.I am using inorder traversal.only root node printed why?
它是一个中序的二叉搜索树 traversal.there 在打印元素时出现问题。
我无法解决 issue.Only root 正在获取 printed.it 可能是语义错误 also.Maybe inserting.or 有问题 inserting.or 显示无序。
#include<stdio.h>
#include<stdlib.h>
struct node
{
int data;
struct node *llink;
struct node *rlink;
};
typedef struct node bstnode;
bstnode *root=NULL;
void insert(int ele)
{
bstnode *cur,*prev,*temp;
temp=(bstnode *)malloc(sizeof(bstnode));
temp->data=ele;
temp->llink=temp->rlink=NULL;
cur=root;
prev=NULL;
if(root==NULL)
root=temp;
else
{
prev=cur;
while(cur!=NULL)
{
if(ele<cur->data)
cur=cur->llink;
else
cur=cur->rlink;
}
if(ele<prev->data)
prev->llink=temp;
else
prev->rlink=temp;
}
//return root;
}
void inorder()
{
if(root==NULL)
{
return;}
else{
inorder(root->llink);
printf("\n%d",root->data);
inorder(root->llink);
}
}
int main()
{
insert(45);
insert(76);
inorder();
}
在此代码段中
else
{
prev=cur;
while(cur!=NULL)
{
if(ele<cur->data)
cur=cur->llink;
else
cur=cur->rlink;
}
if(ele<prev->data)
prev->llink=temp;
else
prev->rlink=temp;
}
逻辑错误。声明
prev=cur;
应在以下 while 语句中。例如
while(cur!=NULL)
{
prev=cur;
if(ele<cur->data)
cur=cur->llink;
else
cur=cur->rlink;
}
和函数 inorder
。也不正确,因为它是在没有参数的情况下声明的
void inorder()
{
if(root==NULL)
{
return;}
else{
inorder(root->llink);
printf("\n%d",root->data);
inorder(root->llink);
}
}
还有两次使用数据成员llink
。
应该像
那样声明和定义
void inorder( const bstnode *node )
{
if ( node )
{
inorder( node->llink );
printf( "\n%d", node->data );
inorder( node->rlink );
}
}
它被称为
inorder( root );
首先是部分
prev=cur;
while(cur!=NULL)
{
if(ele<cur->data)
cur=cur->llink;
else
cur=cur->rlink;
}
错了。
由于prev=cur;
的位置错误,prev
将只是root
而不是指向作为新节点父节点的节点。
该语句应在循环内:
while(cur!=NULL)
{
prev=cur;
if(ele<cur->data)
cur=cur->llink;
else
cur=cur->rlink;
}
其次,函数inorder
是错误的。
当root != NULL
.
时无条件执行
代替忽略参数并无限打印 root
,它应该使用一个参数来指定应该打印哪个节点。
使用 llink
twich 也很奇怪。
可以这样:
void inorder(bstnode* node)
{
if(node==NULL)
{
return;
}
else{
inorder(node->llink);
printf("\n%d",node->data);
inorder(node->rlink);
}
}
而main
函数中的inorder();
应该是inorder(root);
.
它是一个中序的二叉搜索树 traversal.there 在打印元素时出现问题。 我无法解决 issue.Only root 正在获取 printed.it 可能是语义错误 also.Maybe inserting.or 有问题 inserting.or 显示无序。
#include<stdio.h>
#include<stdlib.h>
struct node
{
int data;
struct node *llink;
struct node *rlink;
};
typedef struct node bstnode;
bstnode *root=NULL;
void insert(int ele)
{
bstnode *cur,*prev,*temp;
temp=(bstnode *)malloc(sizeof(bstnode));
temp->data=ele;
temp->llink=temp->rlink=NULL;
cur=root;
prev=NULL;
if(root==NULL)
root=temp;
else
{
prev=cur;
while(cur!=NULL)
{
if(ele<cur->data)
cur=cur->llink;
else
cur=cur->rlink;
}
if(ele<prev->data)
prev->llink=temp;
else
prev->rlink=temp;
}
//return root;
}
void inorder()
{
if(root==NULL)
{
return;}
else{
inorder(root->llink);
printf("\n%d",root->data);
inorder(root->llink);
}
}
int main()
{
insert(45);
insert(76);
inorder();
}
在此代码段中
else
{
prev=cur;
while(cur!=NULL)
{
if(ele<cur->data)
cur=cur->llink;
else
cur=cur->rlink;
}
if(ele<prev->data)
prev->llink=temp;
else
prev->rlink=temp;
}
逻辑错误。声明
prev=cur;
应在以下 while 语句中。例如
while(cur!=NULL)
{
prev=cur;
if(ele<cur->data)
cur=cur->llink;
else
cur=cur->rlink;
}
和函数 inorder
。也不正确,因为它是在没有参数的情况下声明的
void inorder()
{
if(root==NULL)
{
return;}
else{
inorder(root->llink);
printf("\n%d",root->data);
inorder(root->llink);
}
}
还有两次使用数据成员llink
。
应该像
那样声明和定义void inorder( const bstnode *node )
{
if ( node )
{
inorder( node->llink );
printf( "\n%d", node->data );
inorder( node->rlink );
}
}
它被称为
inorder( root );
首先是部分
prev=cur;
while(cur!=NULL)
{
if(ele<cur->data)
cur=cur->llink;
else
cur=cur->rlink;
}
错了。
由于prev=cur;
的位置错误,prev
将只是root
而不是指向作为新节点父节点的节点。
该语句应在循环内:
while(cur!=NULL)
{
prev=cur;
if(ele<cur->data)
cur=cur->llink;
else
cur=cur->rlink;
}
其次,函数inorder
是错误的。
当root != NULL
.
代替忽略参数并无限打印 root
,它应该使用一个参数来指定应该打印哪个节点。
使用 llink
twich 也很奇怪。
可以这样:
void inorder(bstnode* node)
{
if(node==NULL)
{
return;
}
else{
inorder(node->llink);
printf("\n%d",node->data);
inorder(node->rlink);
}
}
而main
函数中的inorder();
应该是inorder(root);
.