此搜索代码中的二进制搜索树中的错误在哪里?

Coderandhacker

我已经为严格的二进制搜索树编写了此代码。(如果二叉树中的每个非叶节点都具有非空的左右子树,则该树被称为严格二叉树。或者换句话说,严格二叉树中的所有节点的度数为零或二,永远不要为一。具有N个叶子的严格二叉树总是包含2N – 1个节点。)不幸的是,它不能正确打印值。我不知道怎么了 我在互联网上看到过其他站点,并且代码几乎相同,但是仍然无法在代码中找到错误。

#include <stdio.h>
#include <stdlib.h>
struct node
{
    struct node* prev;
    int data;
    struct node* next;
};
void Binary_Search_Tree(struct node *newnode,struct node *p);
void print(struct node* p);

main()
{
    struct node *root,*nnode,*temp;
    int c,d;
    root=malloc(sizeof(struct node));

    printf("Enter the root data\t");
    scanf("%d",&d);
    root->data=d;
    root->prev=NULL;
    root->next=NULL;

    while(1)
    {
        printf("Enter your choice\n1 insert element.\n2 print tree.\n3 Exit");
        scanf("%d",&c);
        switch(c)
        {
            case 1:
                nnode=malloc(sizeof(struct node));
                printf("Enter the node data\t");
                scanf("%d",&d);

                nnode->data=d;
                nnode->prev=NULL;
                nnode->next=NULL;
                temp=root;

                Binary_Search_Tree(nnode,temp);
                break;
            case 2:
                temp=root;
                print(temp);
                break;
            case 3:
                free(root);
                free(nnode);
                free(temp);
                temp=nnode=root=NULL;
                exit(1);
                break;
        }
    }
    return 0;
}

void Binary_Search_Tree(struct node *newnode,struct node *p)
{

    if(newnode->data<p->data)
    {
        if(p->prev=NULL)
        {
            p->prev=newnode;
        }
        else if(p->prev!=NULL)
        {
            p=p->prev;
            Binary_Search_Tree(newnode,p);
        }
    }
    else if(newnode->data>p->data)
    {
        if(p->next=NULL)
        {
            p->next=newnode;
        }
        else if(p->next!=NULL)
        {
            p=p->next;
            Binary_Search_Tree(newnode,p);
        }
    }
}

void print(struct node* p)
{
    if(p!=NULL)
    {
        print(p->prev);
        printf("%d\n",p->data);
        print(p->next);
    }
}
用户名

主要的问题是您使用赋值代替了相等性。

if( p->next=NULL )

与您的预期完全不同。这将是

if ( p->next == NULL )
             ^^^

同为p->prev检查会p->prev == NULL

因此,让我们分析您犯错的第一种情况。

if( p->next = NULL )

首先将NULL赋给p->next,然后我们知道赋值语句的结果就是赋值。所以条件是

 if( NULL ) 

因此,if永远不会输入语句。就是else因为那时p->next = NULL因此,它不会添加新节点。树保持不变。

它并没有就此停止。当您丢失了新分配的节点的地址时,这里就会发生内存泄漏。

然后是解决方案

if( p->next == NULL )

好吧,当我们达到叶子级别时,它等于NULL,然后您为其分配新分配的节点的地址。那解决了问题。

几样东西 -

  1. 检查的返回值malloc万一失败,它将返回NULL1个

    root=malloc(sizeof(struct node));
    if( root == NULL ){
       perror("Malloc failure");
       exit(EXIT_FAILURE);
    }
    
  2. 完成使用动态分配的内存后,请释放它。

    void freeTree(struct node *root){
       if( root ){
          freeTree(root->prev);
          freeTree(root->next);
          free(root);
       }
    }
    
  3. 启用编译器警告-Wall -Werror如果您执行了该编译器,则可以清楚地看到问题所在。

    error: suggest parentheses around assignment used as truth value [-Werror=parentheses]
             if(p->next=NULL)
             ^~
    
  4. 好吧,另一件事是检查的返回值scanf

    if( scanf("%d",&d) != 1 ){
      // Input failed 
      exit(EXIT_FAILURE); // or handle error.
    }
    
  5. 如乔纳森·莱夫勒(Jonathan Leffler)的评论中所述,如果您以适当的间距编写语句,则可读性将得到提高。else if(newnode->data>p->data)很难读。相比之下,它else if (newnode->data > p->data)更具可读性。当您编写该语句时,该错误将很容易被您看到if(p->next = NULL)显而易见的是if(p->next == NULL)

释放树有些棘手,因为您将必须始终执行订单后遍历。您需要先释放孩子,然后才能释放父母。否则会发生内存泄漏。

1.前面我提到fprintf(stderr,...)要使用Basile Starynkevitch,perror这是打印诊断错误消息的好选择。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章