【问题标题】:Why is my create function of binary search tree not working?为什么我的二叉搜索树创建功能不起作用?
【发布时间】:2022-01-26 05:13:41
【问题描述】:

create 函数应该是询问用户他们想进入多少个节点,然后一个一个地插入那么多元素。

我正在使用前序遍历函数来检查二叉搜索树的创建

代码在输入部分运行良好,它要求用户输入数据,但是当它应该以预先遍历的方式显示树时,它什么都不做并退出。

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

struct Node
{
    int data;
    struct Node* left;
    struct Node* right;
};

void insert(struct Node* root, int x)
{
    if(root -> left == NULL && x < root -> data)
    {
        struct Node* new_node = (struct Node* )malloc(sizeof(struct Node));
        new_node -> data = x;
        new_node -> left = NULL;
        new_node -> right = NULL;
        root -> left = new_node;
    }
    else if(root -> right == NULL && x > root -> data)
    {
        struct Node* new_node = (struct Node* )malloc(sizeof(struct Node));
        new_node -> data = x;
        new_node -> left = NULL;
        new_node -> right = NULL;
        root -> right = new_node;
    }
    else
    {
        if(x < root -> data)
        {
            insert(root -> left, x);
        }
        else if(x > root -> data)
        {
            insert(root -> right, x);
        }
    }
}

void create(struct Node* root)
{
    root = (struct Node*)malloc(sizeof(struct Node));
    printf("\nHow many nodes do you want to create: ");
    int tree_size;
    scanf("%d", &tree_size);
    printf("\nEnter data for root node: ");
    int ent_data;
    scanf("%d", &ent_data);
    root -> data = ent_data;
    root -> left = NULL;
    root -> right = NULL;
    for(int i=1; i<tree_size; i++)
    {
        printf("\nEnter data for node: ");
        scanf("%d", &ent_data);
        insert(root, ent_data);
    }
}

void preOrderTraversal(struct Node *root)
{
    if(root != NULL)
    {
        printf("%d, ", root -> data);
        preOrderTraversal(root -> left);
        preOrderTraversal(root -> right);    
    }
}


int main()
{
    struct Node* root = NULL;
    create(root);
    
    preOrderTraversal(root);
    return 0;
}

【问题讨论】:

    标签: data-structures tree binary binary-search-tree creation


    【解决方案1】:

    问题是create 不会修改你的主变量root。 C 参数是按值传递的,因此您应该执行以下操作之一:

    • root地址传递给create函数,或者
    • 不要将root 作为参数传递,而是让create 返回根指针。

    首选第二个选项,因为root 不作为create输入值,而是作为输出

    与您的问题无关,但尽量避免代码重复。您的代码中有三个地方调用malloc 并初始化一个节点。而是为此创建一个函数并在这三个地方调用它。

    这里是修改后的代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    struct Node
    {
        int data;
        struct Node* left;
        struct Node* right;
    };
    
    // Function to call whenever you need a node instance
    struct Node * create_node(int x)
    {
        struct Node* new_node = (struct Node*) malloc(sizeof(struct Node));
        new_node -> data = x;
        new_node -> left = NULL;
        new_node -> right = NULL;
        return new_node;
    }
    
    void insert(struct Node* root, int x)
    {
        if(root -> left == NULL && x < root -> data)
        {
            root -> left = create_node(x); // Use function
        }
        else if(root -> right == NULL && x > root -> data)
        {
            root -> right = create_node(x); // Use function
        }
        else
        {
            if(x < root -> data)
            {
                insert(root -> left, x);
            }
            else if(x > root -> data)
            {
                insert(root -> right, x);
            }
        }
    }
    
    struct Node* create() // No parameter, but return type
    {
        printf("\nHow many nodes do you want to create: ");
        int tree_size;
        scanf("%d", &tree_size);
        printf("\nEnter data for root node: ");
        int ent_data;
        scanf("%d", &ent_data);
        struct Node* root = create_node(ent_data); // Use function
        for(int i=1; i<tree_size; i++)
        {
            printf("\nEnter data for node: ");
            scanf("%d", &ent_data);
            insert(root, ent_data);
        }
        return root; // Return the root
    }
    
    void preOrderTraversal(struct Node *root)
    {
        if(root != NULL)
        {
            printf("%d, ", root -> data);
            preOrderTraversal(root -> left);
            preOrderTraversal(root -> right);    
        }
    }
    
    
    int main()
    {
        struct Node* root = create(); // No argument, but return value
        preOrderTraversal(root);
        return 0;
    }
    

    【讨论】:

    • “将root的地址传递给create函数”的意思是说我可以使用指向指针的指针吗?
    • 确实,这就是我的意思。但我随后继续解释说,在这种情况下,这不是最佳实践解决方案。
    • 明白,谢谢!
    • 谢谢你告诉我,我不知道
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多