当前位置: 首页 > 知识库问答 >
问题:

将二叉树转换为简单链表

郑西岭
2023-03-14
struct Monitor {
    int codMonitor;
    char* producator;
    float diagonala;
    int numarPorturi;
};

struct nodls {
    Monitor info;
    nodls* next;
};

nodls* creareNod(Monitor m) { --create node 
    nodls* nou = (nodls*)malloc(sizeof(nodls));
    nou->info.codMonitor = m.codMonitor;
    nou->info.producator = (char*)malloc(sizeof(char)*(strlen(m.producator) + 1));
    strcpy(nou->info.producator, m.producator);
    nou->info.diagonala = m.diagonala;
    nou->info.numarPorturi = m.numarPorturi;
    nou->next = nou;

    return nou;
}

nodls* inserare(nodls* cap, Monitor m) { -- insert 
    nodls* nou = creareNod(m);
    if (cap == NULL) {
        cap = nou;
        cap->next = cap;
    }
    else
    {
        nodls* temp = cap;
        while (temp->next != cap)
            temp = temp->next;
        temp->next = nou;
        nou->next = cap;
    }
    return cap;
}

void afisareMonitor(Monitor m) { -- display struct
    printf("\nMonitorul cu codul %d, producatorul %s, diagonala %f, numarul de porturi %d",
        m.codMonitor, m.producator, m.diagonala, m.numarPorturi);
}

void traversare(nodls** cap) { --display function
    nodls* temp = *cap;
    if (cap == NULL)
        printf("\nLista este goala");
    while (temp->next != *cap) {
        afisareMonitor(temp->info);
        temp = temp->next;
    }
    afisareMonitor(temp->info);

}

void stergereNod(nodls* cap) --delete node function
{
.......
}

void dezalocare(nodls* cap) { free allocate space
............
}

我如何转换使用以下代码,我的二叉树到一个简单的链表。这也许可以用递归来完成。

getLeavesList(root) {

    if root is NULL: return

    if root is leaf_node: add_to_leaves_list(root)

    getLeavesList(root -> left)

    getLeavesList(root -> right)
}

因此,如果根为NULL,也就是,如果函数没有收到有效的指针,则返回错误消息。

如果根是叶,这是,如果左子节点和右子节点都为NULL,您必须将其添加到叶节点列表中。

共有1个答案

党建义
2023-03-14

https://www.geeksforgeeks.org/tree-traversals-inorder-preorder-and-postorder/

本文介绍了三种简单的深度优先方法(preorder、inorder、postorder),用于遍历二叉树。它还有一个很好的简洁的C示例。

您提供的伪代码算法实际上是正确的预序方法。

void printPreorder(struct node*node)

printf(“%d”,节点->数据);

检查节点是否是叶,如果是,将其添加到列表中:

if((node->left == NULL) && (node->right == NULL))
{
     appendList(&node);   
}

当然,appendlist只是我临时创建的,但是根据问题中提供的代码,您将知道如何添加到链接列表中。如果没有,请随时询问。

ps:https://www.geeksforgeeks.org/是一个了不起的资源,感谢那些了不起的工作!

PSPS:如果您希望在第一次使用NULL调用函数时返回错误消息,也就是说,如果没有向遍历传递有效的树,我建议您创建一个包装函数来调用递归树。然后,在这个包装器中,您可以在调用递归方法之前检查传递给它的head是否为NULL。

 类似资料:
  • 这就是我到目前为止的代码(由于递归方面的困难,这并不是太多) 几乎只是将头部指针设置为中间信息(4)

  • 下面给出了二叉树的实现。 如图中所示,树不是完整的二叉树。如何编写一个函数,将上述二叉树转换为完整的二叉树,只需将字符串数据节点添加到没有子节点的节点,即可生成完整的二叉树。 我将手动在代码中添加节点,以获得如下结果树: 但是,如何编写一个函数,它将采取根节点和返回树,这是完整的二叉树。

  • 这个问题是在最近的一次编码采访中被问到的。 问:给定一个二叉树,写一个程序把它转换成双链表。双链表中的节点按zig-zag级顺序遍历形成的序列排列

  • 我想到了以下几点: < li >将树退化为链表,在退化的同时,用链表中的节点对象及其索引创建一个动态数组 看起来像这样 这是一个学生必须在没有任何过去考试参考的情况下编码的问题。我方法的问题是,我几乎不可能在30分钟内正确地写下所有代码,如果我事先记住一些代码,也许是可能的。我想知道是否有一个更简单、更可行和优雅的解决方案来将任何二叉树转换为适当的堆?

  • 我希望将二叉树表示为数组,以便数组在数组中表示为空的广度一阶。我不想使用数组列表,但很乐意使用链表结构。我发现数组的最大大小的大小将是2^n-1,其中n是以下情况下树的高度: 数组的最小大小(除了空树或没有子项的根 [大小为 0 和 3 相应])为 (2^n - 1) - 6,在这种情况下,6 可以计算为前一个级别的空位数乘以 2: 这些树是否可以表示为堆,其中位于索引0并且当前节点在索引i处的左

  • 我正在尝试将后缀表达式转换为二叉树。My函数将标记(字符串)列表作为参数。 每次我给函数任何输入时,调试器都会写一条消息:函数“add”中的非穷举模式。 我的想法是:一个接一个地读取标记,然后确定它是运算符还是操作数。如果是操作数,则不要将任何节点保存到树中,并将数字存储到堆栈中。否则,我用操作符创建一个节点,从堆栈中弹出符号,将它们设置为新节点的子节点,并将操作符推送到堆栈中。 如果字符串列表为