createBinaryTree дает бесконечное L oop, а createBinarySearchTree дает ошибку сегментации - PullRequest
0 голосов
/ 06 января 2020

createBinaryTree дает бесконечное значение L oop, а 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);
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 09 января 2020

Для BinarySearchTree. На первой итерации вы устанавливаете для нового узла значение NULL на каждой итерации. Было бы лучше сначала проверить значение узла, а затем решить, в каком направлении будет проходить дерево. Когда вы нажмете root, добавьте узел. Что-то вроде следующего.

Примите вход 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;

Затем внутри функции обходите дерево, пока не найдете место, где должен находиться узел go.

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;
}
0 голосов
/ 08 января 2020

Для вашей функции createBinaryTree

Проблема в строке scanf ("% d", & temp-> data); Когда вы попадаете на root дерева, вы затем снова вызываете команду создания двоичного дерева на узле над root, который затем перезаписывает вашу предыдущую запись. Чтобы это исправить, вы должны проверить значение scanf перед тем, как присвоить его temp-> data. Кроме того, вместо возврата NULL для -1 вам нужно вернуть root, если 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;
}
...