被困在树枝上

时间:2017-08-31 21:58:00

标签: c data-structures

我正在尝试进行树遍历。(按订单,按顺序和后订购) 这是我的代码。

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


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


void Insert(struct node* root,int item)
{
    struct node* parent;
    struct node* NewNode = (struct node*)malloc(sizeof(struct node));
    NewNode->left = NULL;
    NewNode->data = item;
    NewNode->right = NULL;

    if (root == NULL)
        root = NewNode;
    else
    {
        parent = root;
        while (1)
        {
            if (parent->data>item)
            {
                if(parent->left == NULL)
                {
                    parent->left = NewNode;
                    return;
                }
                parent = parent->left;

            }
            if (parent->data<item)
            {
                if(parent->right == NULL)
                {
                    parent->right = NewNode;
                    return;
                }
                parent = parent->right;
            }
        }

    }
}




void pre(struct node *newNode)
{
    if(newNode!=NULL)
    {
        printf("%d ",newNode->data);
        pre(newNode->left);
        pre(newNode->right);
    }
}

void in(struct node *newNode)
{
    if(newNode!=NULL)
    {
        in(newNode->left);
        printf("%d ",newNode->data);
        in(newNode->right);
    }
}


void post(struct node *newNode)
{
    if(newNode!=NULL)
    {
        post(newNode->left);
        post(newNode->right);
        printf("%d ",newNode->data);
    }
}


int main(void)
{
    int num,i;

    printf("\nHow many Numbers you wanna Enter in tree:\t");
    scanf("%d",&num);
    int numArr[num];
    printf("\nEnter the numbers: \n");
    struct node* root = NULL;
    for (i=0;i<num;i++)
    {
        scanf("%d",&numArr[i]);
        Insert(root,numArr[i]);
    }

    printf("\nPre order traversal is:\n");
    pre(root);
    printf("\nIn order traversal is:\n");
    in(root);
    printf("\nPost order traversal is:\n");
    post(root);
}

我认为插入值时遇到问题,因为当我运行代码时输出只是空的。 谁能解释我哪里出错?

在插入函数m处取根节点并将项目作为参数插入。

然后我使用malloc创建一个新节点。

将数据插入新节点并向左,向右为空,因为左右分支当前未指向任何节点。

然后检查root是否为null。如果为空,则将新节点分配给根节点。

如果root不为null。 (我不应该松开根,所以我将root复制到父级并使用它。)

检查数据是否小于root。如果它离根的左边是少,如果root的左边是null,那么插入新节点的地址,如果它不为空,只需左右移动直到它变为空。

如果数据大于root中的值,则执行相同的操作(向右)。

我的解释告诉我正走在正确的道路上。 但我的代码告诉我一个不同的故事。

1 个答案:

答案 0 :(得分:0)

这是正确的答案,感谢大家的帮助。

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


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


void Insert(struct node** root,int item)
{
    struct node* parent;
    struct node* NewNode = (struct node*)malloc(sizeof(struct node));
    NewNode->left = NULL;
    NewNode->data = item;
    NewNode->right = NULL;

    if (*root == NULL)
        *root = NewNode;
    else
    {
        parent = *root;
        while (1)
        {
            if (parent->data>item)
            {
                if(parent->left == NULL)
                {
                    parent->left = NewNode;
                    return;
                }
                parent = parent->left;

            }
            if (parent->data<item)
            {
                if(parent->right == NULL)
                {
                    parent->right = NewNode;
                    return;
                }
                parent = parent->right;
            }
        }

    }
}




void pre(struct node *newNode)
{
    if(newNode!=NULL)
    {
        printf("%d ",newNode->data);
        pre(newNode->left);
        pre(newNode->right);
    }
}

void in(struct node *newNode)
{
    if(newNode!=NULL)
    {
        in(newNode->left);
        printf("%d ",newNode->data);
        in(newNode->right);
    }
}


void post(struct node *newNode)
{
    if(newNode!=NULL)
    {
        post(newNode->left);
        post(newNode->right);
        printf("%d ",newNode->data);
    }
}


int main(void)
{
    int num,i;

    printf("\nHow many Numbers you wanna Enter in tree:\t");
    scanf("%d",&num);
    int numArr[num];
    printf("\nEnter the numbers: \n");
    struct node* root = NULL;
    for (i=0;i<num;i++)
    {
        scanf("%d",&numArr[i]);
        Insert(&root,numArr[i]);
    }

    printf("\nPre order traversal is:\n");
    pre(root);
    printf("\nIn order traversal is:\n");
    in(root);
    printf("\nPost order traversal is:\n");
    post(root);
}