【问题标题】:createBinaryTree is giving an infinite Loop and createBinarySearchTree is giving segmentation FaultcreateBinaryTree 给出了一个无限循环,而 createBinarySearchTree 给出了分段错误
【发布时间】:2020-01-06 19:47:35
【问题描述】:

createBinaryTree 给出了一个无限循环,createBinarySearchTree 给出了分段错误。 有人可以指导我,因为我对数据结构很陌生。

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

typedef struct node
{
    int data;
    struct node *lchild;
    struct node *rchild;
} * NODE;

NODE createBinaryTree(NODE root)
{
    NODE temp = (NODE)malloc(sizeof(struct node));
    printf("Enter the value of the node. \n Enter -1 for returning. \n");
    scanf(" %d", &temp->data);
    if (temp->data == -1)
        return NULL;
    else
    {
        printf("For left Node of %d \n", temp->data);
        temp->lchild = createBinaryTree(temp->lchild);
        printf("For right Node of %d \n", temp->data);
        temp->rchild = createBinaryTree(temp->rchild);
    }
    return temp;
}
NODE createBinarySearchTree(NODE root, int ele)
{
    NODE new_node;
    new_node = (NODE)malloc(sizeof(struct node));
    new_node->data = ele;
    new_node->lchild = new_node = NULL;

    if (root == NULL)
        return new_node;

    NODE parent = NULL;
    NODE curr = root;

    while (curr != NULL)
    {
        parent = curr;
        if (curr->data < ele)
            curr = curr->rchild;
        else
            curr = curr->lchild;
    }

    if (ele < parent->data)
        parent->lchild = new_node;
    else
        parent->rchild = new_node;

    return root;
}

void inorder(NODE ptr)
{
    if (ptr != NULL)
    {
        inorder(ptr->lchild);
        printf("%5d", ptr->data);
        inorder(ptr->rchild);
    }
}

void postorder(NODE ptr)
{
    if (ptr != NULL)
    {
        postorder(ptr->lchild);
        postorder(ptr->rchild);
        printf("%5d", ptr->data);
    }
}

void preorder(NODE ptr)
{
    if (ptr != NULL)
    {
        printf("%5d", ptr->data);
        preorder(ptr->lchild);
        preorder(ptr->rchild);
    }
}

void main()
{
    NODE root = NULL;

    printf("Enter 0.createBinaryTree \n");
    printf("Enter 1.createBinarySearchTree \n");
    printf("Enter 2.displayTree \n");
    printf("Enter 3.searchTree \n");

    int choice;
    printf("Enter your choice\n");
    scanf(" %d", &choice);

    int tempvalue;

    while (1)
    {
        switch (choice)
        {
        case 0:
            root = createBinaryTree(root);
            break;

        case 1:
            printf("Enter Root Node\n");
            scanf(" %d", &tempvalue);
            while (tempvalue != -1)
            {
                root = createBinarySearchTree(root, tempvalue);
                break;
                printf("Enter Next Node.\n Enter -1 to exit\n");
                scanf(" %d", &tempvalue);
            }
            break;

        case 2:
            printf("\n Inorder Traversals \n");
            inorder(root);
            printf("\n Postorder Traversals \n");
            postorder(root);
            printf("\n Preorder Traversals \n");
            preorder(root);
            printf("\n ********* \n");
            break;
        case 4:
            exit(0);
        }
    }
}

【问题讨论】:

  • 你能提供你给你的函数的输入序列吗?
  • 1//createBinaryTree 5 6 7 -1 -1 -1 -1 之后进入无限序列

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


【解决方案1】:

对于 BinarySearchTree。在第一次迭代中,您在每次迭代中将新节点设置为 NULL。最好先检查节点的值,然后决定遍历树的方向。当你点击根时添加节点。类似于以下内容。

分别取root的输入,以便比较下一个输入。

        case 1:
        printf("Enter Root Node\n");
        scanf(" %d", &tempvalue);
        NODE root;
        root = (NODE)malloc(sizeof(struct node));
        root->data = tempvalue;
        while (tempvalue != -1)
        {   
            printf("Enter Node Value\n");
            scanf(" %d", &value);
            if(value == -1){
                break;
            }
            root = createBinarySearchTree(root, value);
        }
        return 0;

然后在函数内部,遍历树直到找到节点应该去的地方。

NODE createBinarySearchTree(NODE root, int ele)
{
    NODE new_node;
    new_node = (NODE)malloc(sizeof(struct node));
    new_node->data = ele;

    if (root == NULL)
        return new_node;

    NODE curr = root;

    while (curr != NULL)
    {
        printf("%d\n",curr->data);
        if(ele < curr->data )
        {
            if(curr->lchild == NULL){
                printf("inserted %d as left child of %d\n",ele,curr->data );
                curr->lchild = new_node;
                return root;
            }
            curr=curr->lchild;
        }
        else if(ele > curr->data)
        {
            if(curr->rchild == NULL){
                printf("inserted %d as right child child of %d\n",ele,curr->data );
                curr->rchild = new_node;
                return root;
            }
             curr=curr->rchild;
        }
    }
    return root;
}

【讨论】:

  • 再次感谢您的回复。现在有了这个实现,插入 5 ,6 , 7 ,1 -> 会产生无限循环。
【解决方案2】:

对于您的 createBinaryTree 函数

问题在于 scanf(" %d", &temp->data); 行当您到达树的根部时,您然后在根部上方的节点上再次调用创建二叉树,然后覆盖您之前的条目。要解决此问题,您应该在将其分配给 temp->data 之前检查 scanf 的值。此外,您需要返回 root,而不是在 -1 上返回 NULL,以防在上一次迭代中设置了 root。类似于以下内容。

编辑

typedef struct node
{
    int data;
    struct node *lchild;
    struct node *rchild;
} * NODE;

NODE createBinaryTree(NODE root)
{
    printf("Enter the value of the node. \n Enter -1 for returning. \n");
    int input = 0; 
    scanf(" %d", &input);
    printf("%d\n",input );
    if(input == -1 && root == NULL){
        return NULL;
    }
    if(input == -1 && root != NULL){
        return root;
    }
    NODE temp = (NODE)malloc(sizeof(struct node));
    temp->data = input;
    if (temp->data == -1)
        return NULL;
    else
    {
        printf("For left Node of %d \n", temp->data);
        temp->lchild = createBinaryTree(temp->lchild);
        printf("For right Node of %d \n", temp->data);
        temp->rchild = createBinaryTree(temp->rchild);
    }
    return temp;
}
NODE createBinarySearchTree(NODE root, int ele)
{
    NODE new_node;
    new_node = (NODE)malloc(sizeof(struct node));
    new_node->data = ele;

    new_node->lchild = new_node;

    if (root == NULL)
        return new_node;

    NODE parent = NULL;
    NODE curr = root;

    while (curr != NULL)
    {
        parent = curr;
        if (curr->data < ele)
            curr = curr->rchild;
        else
            curr = curr->lchild;
    }

    if (ele < parent->data)
        parent->lchild = new_node;
    else
        parent->rchild = new_node;

    return root;
}

void inorder(NODE ptr)
{
    if (ptr != NULL)
    {
        inorder(ptr->lchild);
        printf("%5d", ptr->data);
        inorder(ptr->rchild);
    }
}

void postorder(NODE ptr)
{
    if (ptr != NULL)
    {
        postorder(ptr->lchild);
        postorder(ptr->rchild);
        printf("%5d", ptr->data);
    }
}

void preorder(NODE ptr)
{
    if (ptr != NULL)
    {
        printf("%5d", ptr->data);
        preorder(ptr->lchild);
        preorder(ptr->rchild);
    }
}

int main()
{
    NODE root = NULL;

    printf("Enter 0.createBinaryTree \n");
    printf("Enter 1.createBinarySearchTree \n");
    printf("Enter 2.displayTree \n");
    printf("Enter 3.searchTree \n");

    int choice;
    printf("Enter your choice\n");
    scanf(" %d", &choice);

    int tempvalue;

    while (1)
    {
        switch (choice)
        {
        case 0:
            root = createBinaryTree(root);
            printf("Done\n");
            return 0;

        case 1:
            printf("Enter Root Node\n");
            scanf(" %d", &tempvalue);
            while (tempvalue != -1)
            {
                root = createBinarySearchTree(root, tempvalue);
                break;
                printf("Enter Next Node.\n Enter -1 to exit\n");
                scanf(" %d", &tempvalue);
            }
            return 0;

        case 2:
            printf("\n Inorder Traversals \n");
            inorder(root);
            printf("\n Postorder Traversals \n");
            postorder(root);
            printf("\n Preorder Traversals \n");
            preorder(root);
            printf("\n ********* \n");
            return 0;
        case 4:
            exit(0);
        }
    }
    return 0;
}

【讨论】:

  • 感谢您的帮助。但是,现在它也提供了无限循环,但它是一种不同的循环。我也收到警告:指针和整数之间的比较。
  • 犯了几个语法错误。编辑后的代码应该可以工作。
  • 感谢伙伴,createBinaryTree 完美运行。你能告诉我为什么 createBinarySearchTree 在获取根节点后就停止了吗?
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 2015-05-13
  • 1970-01-01
  • 2023-02-17
  • 2013-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多