Как читать дерево - PullRequest
       3

Как читать дерево

0 голосов
/ 01 февраля 2019

Язык - C. Я должен прочитать дерево в представлении leftmostChild-rightSibling.Определения:

typedef struct Node *pNode;
struct Node {
    int data;
    pNode parent, leftmostChild, rightSibling;
}

Мне нужна функция:

pNode read_pNode(void)

Эта функция создаст дерево в куче и вернет указатель на него.Вся информация будет взята от пользователя в консоли.Например, поле данных будет читаться как root.

Затем пользователя спросят, сколько дочерних элементов root, и прочитайте поддеревья для каждого из дочерних элементов.

Как написать такую ​​функцию?

1 Ответ

0 голосов
/ 05 февраля 2019

Если кто-то заинтересован в решении, вот оно:

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

typedef struct Node *pNode;
struct Node {
  int data;
  pNode leftmostChild, rightSibling;
};

pNode read_pNode( void )
{
  int n;
  pNode p = malloc(sizeof( struct Node ) );
  printf("Input the node label (int ):");
  scanf("%d", &(p->data) );
  p->leftmostChild = NULL;
  p->rightSibling = NULL;
  printf("Input the number of children fot this node (0 for none): ");
  scanf("%d", &n);
  if( n == 0 ) return p;
  pNode *q = malloc( sizeof( pNode) * n );
  for( int j = 0; j < n ; j++ ) q[j]=read_pNode();
  p->leftmostChild = *q;
  for( int j = 0; j < n-1; j++ )
    q[j]->rightSibling = q[j+1];
  q[n-1]->rightSibling = NULL;
  free(q);
  return p;
}

void preorder_pNode( pNode p)
{
  pNode q;
  printf("%d ", p->data);
  q = p->leftmostChild;
  while( q != NULL ) {
    preorder_pNode( q );
    q = q -> rightSibling;
  }
}

int main(void)
{
  pNode p=read_pNode();
  preorder_pNode(p);
  return 0;
}

Вот более сложный вопрос.Как освободить память, выделенную для read_pNode?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...