递归地创建树

时间:2014-10-22 12:20:07

标签: c tree

我正在尝试在C中递归创建一个树。

到目前为止,我已经完成了以下代码。但是在编译时我会得到以下错误按摩;

  

错误:请求成员'esq'不是结构或联合        MakeTree(H-1,p-> left,p);                         ^    错误:请求成员'dir'的东西不是结构或联合        MakeTree(H-1,p->; right,p);                         ^

我做错了什么?

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

typedef struct nohh {
  int info;
  struct nohh *left;
  struct nohh *right;
  struct nohh *up;
} nohh, *noh;

void MakeTree(int H, noh *p, noh *u);

int main(){
  noh p = NULL;
  int h;

  printf("What is the Tree height? ");
  scanf("%d\n", &h);

  MakeTree(h, &p, &p);

  return 0;
}

void MakeTree(int H, noh *p, noh *u){

  while(H>=0){
    p = malloc(sizeof(noh));
    (*p)->up = *u;
    MakeTree(H-1, p->left, p);
    MakeTree(H-1, p->right, p);
  }
}

感谢。

2 个答案:

答案 0 :(得分:2)

void MakeTree(int H, noh *p, noh *u)
{
  if (H>0)
  {
    *p = malloc(sizeof(nohh));
    (*p)->up = *u;
    MakeTree(H-1, &(*p)->left, p);
    MakeTree(H-1, &(*p)->right, p);
  }
}

这应该可以解决你的问题:

你想要递归,所以你不需要while循环。 你想要malloc结构的大小而不是指针的大小,并将其写入main中原始p的位置。 MakeTree中的p是指向struct的指针,所以你必须取消引用两次然后你想要成员的地址=&gt; &(*p)->left&(*p)->right

一个建议:不要调用结构nohh和指向它的指针noh,这是不可读的。

答案 1 :(得分:1)

这个解决方案更易读,避免指向指针。

struct nohh {
  int info;
  struct nohh *left;
  struct nohh *right;
  struct nohh *up;
} ;

struct nohh *MakeTree(int h, struct nohh *up)
{
  if (h >= 0)
  {
    struct nohh *p = (struct nohh *)malloc(sizeof(struct nohh));
    p->up = up;
    p->left  = MakeTree(h - 1, p);
    p->right = MakeTree(h - 1, p);
    return p ;
  }

  return NULL ;
}


int main(){
  struct nohh *p ;
  int h;

  printf("What is the Tree height? ");
  scanf("%d", &h);

  p = MakeTree(h, NULL);

  return 0;
}