【问题标题】:Problem in one of the function of the BST program in CC中BST程序的功能之一的问题
【发布时间】:2021-11-23 05:28:45
【问题描述】:
#include <stdlib.h>

struct btNode
{
    int data;
    struct btNode *right;
    struct btNode *left;
} * root, *temp1, *temp2;

void create(int);
void insert(int);
void postorder(struct btNode *);

int main()
{
    int choice, item;

    do
    {
        printf("\nChoose one of the options:\n");
        printf("1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit\n");
        scanf("%d", &choice);

        switch (choice)
        {
        case 1:
            printf("\nEnter any number to insert:");
            scanf("%d", &item);
            insert(item);
            break;

        case 4:
            postorder(root);
            break;

        case 6:
            break;

        default:
            printf("\nWRONG INPUT");
        }
    } while (choice != 6);

    return 0;
}

void create(int num)
{
    temp1 = (struct btNode *)malloc(sizeof(struct btNode));
    temp1->data = num;
    temp1->left = NULL;
    temp1->right = NULL;
}

void insert(int num)
{
    create(num);
    if (root == NULL)
    {
        root = temp1;
        printf("%d inserted\n", root->data);
    }
    else
    {
        temp2 = root;
        while (temp2 != NULL)
        {
            //printf("inside while");
            if (temp2->data >= num)
            {
                temp2 = temp2->left;
                
            }

            else
            {
                temp2 = temp2->right;
      
            }
        }
        temp2 = temp1;
        printf("%d inserted\n", temp2->data);
    }
    
}

void postorder(struct btNode *r)
{
    if (root == NULL)
    {
        printf("Tree is empty");
        return;
    }

    else
    {
        postorder(r->left);
        postorder(r->right);
        printf("%d ", r->data);

    }
    
}

以上是一个不完整的 BST 菜单驱动程序。我现在尝试执行创建节点、插入和后序的功能。但是当我插入几个元素并尝试执行后序时,主要的问题就出现了,程序突然杀死了自己。我试图调试程序,在所有三个函数处设置断点。并且在调试create()insert() 函数期间运行良好,但主要问题出现在postorder() 函数期间。请帮我解决问题。

【问题讨论】:

  • 全局变量是多个问题的根源。我建议摆脱它们。相反,学习如何使用函数返回值以及如何通过引用传递参数。
  • @user3386109,在后序中,我看到的一个明显问题是检查root == NULL 而不是r == NULL
  • 另请注意,您仅将 NULL 分配给 left 和 right,因此任何节点都不能指向任何其他节点。
  • @kiner_shah 是的,我忽略了名称不匹配。

标签: c binary-search-tree


【解决方案1】:

请查看我标记为// CHANGE HERE的cmets。

测试链接:https://onlinegdb.com/FK7SQ02nP

#include <stdlib.h>
#include <stdio.h>

struct btNode
{
    int data;
    struct btNode *right;
    struct btNode *left;
};    // CHANGE HERE: remove globals

struct btNode* create(int);    // CHANGE HERE: signature change
struct btNode* insert(struct btNode*, int); // CHANGE HERE: signature change
void postorder(struct btNode *);

int main()
{
    int choice, item;
    // CHANGE HERE: assign root to NULL
    struct btNode* root = NULL;
    do
    {
        printf("\nChoose one of the options:\n");
        printf("1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit\n");
        scanf("%d", &choice);

        switch (choice)
        {
        case 1:
            printf("\nEnter any number to insert:");
            scanf("%d", &item);
            root = insert(root, item);
            break;

        case 4:
            postorder(root);
            break;

        case 6:
            break;

        default:
            printf("\nWRONG INPUT");
        }
    } while (choice != 6);

    return 0;
}

// CHANGE HERE: return the pointer from function
struct btNode* create(int num)
{
    struct btNode* temp1 = (struct btNode *)malloc(sizeof(struct btNode));
    temp1->data = num;
    temp1->left = NULL;
    temp1->right = NULL;
    return temp1;
}
// CHANGE HERE: accept root node as argument and return the root node from function
struct btNode* insert(struct btNode* root, int num)
{
    // CHANGE HERE: store returned pointer
    struct btNode* temp1 = create(num);
    if (root == NULL)
    {
        root = temp1;
        printf("%d inserted\n", root->data);
    }
    else
    {
        // CHANGE HERE: see the while loop
        struct btNode* temp2 = root;
        while (temp2 != NULL)
        {
            //printf("inside while");
            if (temp2->data >= num)
            {
                // CHANGE HERE
                if (temp2->left)
                    temp2 = temp2->left;
                else
                {
                    temp2->left = temp1;
                    printf("%d inserted\n", temp2->left->data);
                    break;
                }
            }

            else
            {
                // CHANGE HERE
                if (temp2->right)
                    temp2 = temp2->right;
                else
                {
                    temp2->right = temp1;
                    printf("%d inserted\n", temp2->right->data);
                    break;
                }
            }
        }
        // CHANGE HERE: commented these two lines
        // temp2 = temp1;
        // printf("%d inserted\n", temp2->data);
    }
    return root;
}

void postorder(struct btNode *r)
{
    // CHANGE HERE: replaced root with r
    if (r == NULL)
    {
        printf("Tree is empty");
        return;
    }

    else
    {
        // CHANGE HERE: call postorder only if children are not null
        if (r->left) postorder(r->left);
        if (r->right) postorder(r->right);
        printf("%d ", r->data);
    }
}

样本输出:

Choose one of the options:
1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
1

Enter any number to insert:2
2 inserted

Choose one of the options:
1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
1

Enter any number to insert:34
34 inserted

Choose one of the options:
1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
1

Enter any number to insert:564
564 inserted

Choose one of the options:
1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
1

Enter any number to insert:342
342 inserted

Choose one of the options:
1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
1

Enter any number to insert:-1000
-1000 inserted

Choose one of the options:
1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
1

Enter any number to insert:-332
-332 inserted

Choose one of the options:
1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
1

Enter any number to insert:-987
-987 inserted

Choose one of the options:
1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
1

Enter any number to insert:-9
-9 inserted

Choose one of the options:
1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit
4
-987 -9 -332 -1000 342 564 34 2 
Choose one of the options:
1. Insert 2. Delete 3. Inorder 4. Postorder 5. Preorder 6. Exit

【讨论】:

  • 是的,它对我有用,但是如果树中没有节点,你能告诉我如何打印树为空
  • @SuperRv002,很简单。我已经编辑了代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
  • 2016-01-24
  • 2016-07-31
  • 1970-01-01
相关资源
最近更新 更多