我的代码不打印二叉搜索树的元素:
//x is the element to be inserted
//structure of program
typedef struct BST
{
int info;
struct BST *left;
//pointer to left node
struct BST *right;
//pointer to right node
}
bst;
//global root variable
bst *root;
void insert(int x)
{
bst *ptr,*sptr=root;
ptr=(bst*)malloc(sizeof(bst));
ptr->info=x;
if(root==NULL)
{
ptr->left=ptr->right=NULL;
root=ptr;
}
while(sptr!=NULL)
{
if(x<sptr->info)
{
sptr=sptr->left;
}
else
sptr=sptr->right;
}
sptr=ptr;
}
编辑:
//following is the show function
void show()
{
bst *ptr=root;
while(ptr!=NULL)
{
//it will print untill the ptr is null
printf("%d",ptr->info);
ptr=ptr->left;
ptr=ptr->right;
}
}
答案 0 :(得分:1)
root
的价值来自哪里?你没有在任何地方传递价值?此外,当我们不知道bst
类型的设计时,很难提供帮助。
看来你有正确的想法。创建一个节点,并为其提供一些数据。如果root为null,则新值是BST的根。之后,继续使用标准BST行为在根的左侧或右侧子树中找到第一个空节点。最后,当你到达终点时,继续将最后一个节点插入适当的位置。
void insert(int x)
{
bst *ptr, *sptr=root; //<-- the value right here?
ptr = malloc(sizeof(bst));
ptr->info = x;
if(root == NULL)
{
ptr->left=ptr->right=NULL;
root=ptr;
}
while(sptr!=NULL)
{
if(x<sptr->info)
{
sptr=sptr->left;
}
else
sptr=sptr->right;
}
sptr=ptr; // <-- What is this line trying to do?
}
但是,您的更新树在哪里?
因为在C中,所有内容都是按值传递的,所以在您离开此函数后,您遇到的问题是您没有看到更新的树。您需要继续并更改函数以返回bst*
类型,并在整个函数期间维护根节点。现在第一行代码(*sptr = root
)更有意义!最后,您没有将ptr
的左右字段设置为NULL。这意味着你跳过你的if语句。
bst* insert(int x, bst *root)
{
bst *ptr, *sptr=root;
ptr = malloc(sizeof(bst));
ptr->left = NULL;
ptr->right = NULL;
ptr->info = x;
if(root == NULL)
{
ptr->left=ptr->right=NULL;
root=ptr;
return root;
}
while(sptr!=NULL)
{
if(x<sptr->info)
{
sptr=sptr->left;
}
else
sptr=sptr->right;
}
sptr=ptr;
return root;
}
下一个功能怎么样?
我刚开始看这个。我不习惯c中的全局变量,所以我将继续进行两次修改。让我们做这个递归,并传递根的值,而不是使用全局。
void show(bst *root)
{
if(root == NULL){
return;
}
printf("%d",root->info);
show(root->left);
show(root->right);
}
这将获取一些值,并以递归方式求解树,并在到达每个节点时进行打印。因此,它将打印根节点(如果存在),然后在打印右子树之前打印左侧整个左子树。
最后,查看您的主要
我添加了局部变量root
,因此您必须在主函数之外删除名为root
的全局变量。我还将它的值设置为null,以便您的第一个插入将正确触发。
int main()
{
int i,n,x;
bst *root = NULL; //<-- I added this line of code to remove the global
puts("Enter number of elements");
scanf("%d",&x);
for(i=0;i<x;i++)
{
puts("Enter elements");
scanf("%d",&n);
root = insert(n, root);
}
show(root);
return 0;
}
我希望这有帮助!