【问题标题】:Cloning an n-ary tree in C在 C 中克隆一棵 n 叉树
【发布时间】:2020-04-18 12:13:06
【问题描述】:

我的结构维护父、子和兄弟指针以及其他数据变量。

struct semNode {
    struct semNode *child;
    struct semNode *parent;
    struct semNode *sibling;
    int data;
    int tag;
};

如果我必须克隆相同数据类型的精确树,我该如何以递归或迭代的方式进行。

我计划采用递归方法,按顺序遍历树,然后添加到指针,但我不确定这种方法是否可行。请帮帮我。

【问题讨论】:

  • 当你使用树时,使用递归解决方案总是更好。
  • @lesheenSaxena:您可以通过单击分数下方的灰色复选标记来接受其中一个答案。

标签: c pointers tree


【解决方案1】:

您可以使用简单的递归函数克隆树:

struct semNode {
    struct semNode *child;
    struct semNode *parent;
    struct semNode *sibling;
    int data;
    int tag;
};

void free_semNode(struct semNode *node) {
    if (node) {
        free_semNode(node->sibling);
        free_semNode(node->child);
        free(node);
    }
}

struct semNode *clone_semNode(struct semNode *node, struct semNode *parent) {
    struct semNode *new_node = malloc(sizeof(*new_node));
    if (new_node != NULL) {
        new_node->data = node->data;
        new_node->tag = node->tag;
        new_node->parent = parent;
        new_node->child = NULL;
        new_node->sibling = NULL;
        if (node->child) {
            new_node->child = clone_semNode(node->child, new_node);
            if (new_node->child == NULL) {
                free_semNode(new_node);
                return NULL;
            }
        }
        if (node->sibling) {
            new_node->sibling = clone_semNode(node->sibling, parent);
            if (new_node->sibling == NULL) {
                free_semNode(new_node);
                return NULL;
            }
        }
    }
    return new_node;
}

整个树可以用clone_semNode(tree, NULL); 克隆,子树可以用clone_semNode(node, node->parent); 克隆,但是原始子树和克隆的子树都会指向同一个父树,这可能会给正确的内存管理带来困难。

【讨论】:

    猜你喜欢
    • 2020-08-24
    • 1970-01-01
    • 2015-12-20
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 2017-01-28
    相关资源
    最近更新 更多