父亲表示法的树转换为孩子兄弟表示法(c语言)

父亲表示法是树最简单、空间效率最高的存储结构。请设计将基于父亲表示法的树转换为孩子兄弟表示法,即二叉链表结构的树的算法。在此规定任一结点的子结点按索引编号的递增序从头向尾链接。

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

/* 孩子兄弟表示法结构定义 */
typedef int TElemSet;
typedef struct BinaryTreeNode *BinaryTree;
struct BinaryTreeNode {
    TElemSet data;             /* 数据元素 */
    BinaryTree first_child;    /* 第一个子结点 */
    BinaryTree next_sibling;   /* 下一个兄弟结点 */
};
/* 孩子兄弟表示法结构定义 结束 */

/* 父亲表示法结构定义 */
typedef int Position;
#define NIL -1
typedef struct TreeNode *Tree;
struct TreeNode {
    TElemSet data;    /* 数据元素 */
    Position parent;  /* 父结点位置 */
};
/* 父亲表示法结构定义 结束 */

BinaryTree ConvertTree(Tree tree, int n);

void Visit(BinaryTree tree)
{
    printf("%d\n", tree->data);
}

void PreOrder(BinaryTree tree)
{
    if (tree != NULL) { /* 空树不做处理,直接返回 */
        Visit(tree);                  /* 先访问结点tree */
        PreOrder(tree->first_child);  /* 接下来访问tree所有子孙结点 */
        PreOrder(tree->next_sibling); /* 最后访问tree后序的兄弟结点及其子孙 */
    }
}

int main(void)
{
    int n, i;
    Tree tree;
    BinaryTree bin_tree;
    
    scanf("%d\n", &n);
    tree = (Tree)malloc(sizeof(struct TreeNode) * n);
    for (i=0; i<n; i++) {
        scanf("%d %d\n", &tree[i].data, &tree[i].parent);
    }
    bin_tree = ConvertTree(tree, n);
    PreOrder(bin_tree);
    
    return 0;
}
/* 你的代码将被嵌在这里 */

就是链式前向星啊,不过是c语言版
这里手动malloc的内存还不会自动释放

BinaryTree ConvertTree(Tree tree, int n) {
    // BinaryTree rt = malloc(sizeof(*rt));
    BinaryTree *arr = calloc(n, sizeof *arr);
    // BinaryTree root = new tmp;
    int root;

    for (int i = 0; i < n; ++i) {
        arr[i] = malloc(sizeof *arr[i]);
        if (!arr[i]) {
            return NULL;
        }
        arr[i]->data = tree[i].data;
        arr[i]->first_child = NULL;
        arr[i]->next_sibling = NULL;
    }

    for (int i = n - 1; i >= 0; i--) {
        int fa = tree[i].parent;
        if (fa == -1) {
            root = i;
        } else {
            arr[i]->next_sibling = arr[fa]->first_child;
            arr[fa]->first_child = arr[i];
        }
    }
    return arr[root];
}
github