繁体   English   中英

c中的二叉树遍历

[英]Binary tree traversal in c

有人可以解释一下这段代码可能有什么问题吗,我一直在试图寻找问题,但它仍然给我这些错误:

prog.c: In function 'inorder':
prog.c:43:20: warning: format '%d' expects argument of type 'int', but argument 2 has type 'struct node *' [-Wformat=]
             printf("\n%d", t->left);
                ^
prog.c:44:21: warning: passing argument 1 of 'inorder' makes pointer from integer without a cast [-Wint-conversion]
             inorder(t->data);
                 ^
prog.c:39:9: note: expected 'node * {aka struct node *}' but argument is of type 'int'
     int inorder(node *t)
     ^
prog.c: In function 'postorder':
prog.c:52:20: warning: format '%d' expects argument of type 'int', but argument 2 has type 'struct node *' [-Wformat=]
             printf("\n%d", t->left);
                    ^
prog.c:54:23: warning: passing argument 1 of 'postorder' makes pointer from integer without a cast [-Wint-conversion]
             postorder(t->data);
                   ^
prog.c:48:13: note: expected 'node * {aka struct node *}' but argument is of type 'int'
         int postorder(node *t)
             ^
prog.c: In function 'main':
prog.c:65:1: warning: implicit declaration of function 'preorder' [-Wimplicit-function-declaration]
 preorder(root);
 ^
prog.c:67:1: warning: implicit declaration of function 'inorder' [-Wimplicit-function-declaration]
 inorder(root);
 ^
prog.c:69:1: warning: implicit declaration of function 'postorder' [-Wimplicit-function-declaration]
 postorder(root);
 ^
/tmp/ccXklWoM.o: In function `main':
c4068222a0281abc5ccfae03851cee26.c:(.text+0xde): undefined reference to `preorder'
c4068222a0281abc5ccfae03851cee26.c:(.text+0xf9): undefined reference to `inorder'
c4068222a0281abc5ccfae03851cee26.c:(.text+0x114): undefined reference to `postorder'
collect2: error: ld returned 1 exit status

这是下面的代码:

#include<stdio.h>
#include<stdlib.h>
typedef struct node

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

node *create()

    {
        node *p;
        int x;
        printf("Enter data (-1 for no data): ");
        scanf("%d", &x);
        if(x==-1)
        {

    return NULL;
    }
    else{
        p=(node*)malloc(sizeof(node));
        printf("Enter left child node: \n");
        p->left=create();
        printf("Enter right child node: \n");
        p->right=create();
        return p;
    }

    int preorder(node *t)
    {
        if(t!=NULL)
        {
            printf("\n%d", t->data);
            preorder(t->left);
            preorder(t->right);
        }
    }

    int inorder(node *t)
    {
        if(t!=NULL)
        {
            printf("\n%d", t->left);
            inorder(t->data);
           inorder(t->right);
        }

        int postorder(node *t)
    {
        if(t!=NULL)
        {
            printf("\n%d", t->left);
            postorder(t->right);
            postorder(t->data);
        }
    }
    }
}

int main()
{
  node *root;
  root=create();
  printf("\nThe preorder traversal is: \n");
  preorder(root);
  printf("\nThe inorder traversal is: \n");
  inorder(root);
  printf("\nThe postorder traversal is: \n");
  postorder(root);
  return 0;
}
  1. 您的代码格式不正确。 您忘记关闭大括号} 您需要在编写函数后关闭它们: void foo(){//code for function}
  2. 您不能使用%d打印指针。 如果要打印节点的值,请尝试printf("\\n%d", t->data) 如果要打印指针,请尝试使用%p
  3. 您没有保存读取值x
  4. 你没有像你应该的那样遍历树。 谷歌它并阅读更多关于它的信息。

格式化代码:

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

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

node *create() {
    node *p;
    int x;
    printf("Enter data (-1 for no data): ");
    scanf("%d", &x);
    if (x == -1) {

        return NULL;
    } else {
        p = (node *) malloc(sizeof(node));
        //save read value
        p->data=x;
        printf("Enter left child node: \n");
        p->left = create();
        printf("Enter right child node: \n");
        p->right = create();
        return p;
    }
}

//function is not returning anything so its return type should be void
void preorder(node *t) {
    if (t != NULL) {
        //key left right
        printf("\n%d", t->data);
        preorder(t->left);
        preorder(t->right);
    }
}

void inorder(node *t) {
    if (t != NULL) {
        //left key right
        inorder(t->left);
        printf("\n%d", t->data);
        inorder(t->right);
    }
}

void postorder(node *t) {
    if (t != NULL) {
        //left right key
        postorder(t->right);
        postorder(t->left);
        printf("\n%d", t->data);
    }
}

int main() {
    node *root;
    root = create();
    printf("\nThe preorder traversal is: \n");
    preorder(root);
    printf("\nThe inorder traversal is: \n");
    inorder(root);
    printf("\nThe postorder traversal is: \n");
    postorder(root);
    return 0;
}

编辑:将preorderinorderpostorder函数返回类型从int更改为void

在您的preorder inorderpostoder您在参数中出错:

       printf("\n%d", t->left);    // you can't print a node
       inorder(t->data);           // you can't traverse an integer

应该是:

       printf("\n%d", t->data);
       inorder(t->left);

create您忘记分配数据:

       p->data= x;

您可能正在编译为 C++ 而不是 C。这解释了未定义的引用,因为您有重载的函数,而 C++ 编译器找不到各种重载的函数。 编译为 C。

注意:对于前序/中序/后序,只需移动打印语句并递归调用适当的函数。

1. You have defined the function inorder, postorder and preorder in the create function. Place the closing brackets correctly and it will resolve that error.

2. In create function, you are not assigning the data to node. 

3. Inorder, postorder and preorder function needs of data type node* but you are passing of data type int at several places. That is the reasons of some warnings. 

4. I have written the same code based on your implementation. I complied with gcc and run a test. It seems okay. Have a look at it for your reference. 
#include<stdio.h>
#include<stdlib.h>
struct node
{
      int data;
      struct node *left;
      struct node *right;
};

typedef struct node node; 
node *create()
{

    int x;
    printf("Enter data (-1 for no data): ");
    scanf("%d", &x);
    if(x==-1)
    {
        return NULL;
    }
    else
    {
        node *p;
        p=(node*)malloc(sizeof(node));
        p->data = x;
        printf("Enter left child node: \n");
        p->left=create();
        printf("Enter right child node: \n");
        p->right=create();
        return p;
    }
}

void preorder(node *t)
{
    if(t!=NULL)
    {
            printf("\n%d", t->data);
            preorder(t->left);
            preorder(t->right);
    }
    return; 
}

void inorder(node *t)
{

    if(t != NULL)
    {
        inorder(t->left);
        printf("%d\n", (t->data));
        inorder(t->right);
    }

    return;
}

void postorder(node *t)
{
    if(t!=NULL)
    {
        postorder(t->left);
        postorder(t->right);
        printf("%d\n", (t->data));
    }
    return; 
}



int main()
{
  node *root;
  root=create();
  printf("\nThe preorder traversal is: \n");
  preorder(root);
  printf("\nThe inorder traversal is: \n");
  inorder(root);
  printf("\nThe postorder traversal is: \n");
  postorder(root);
  return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM