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,您必须将其添加到叶节点列表中。
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”中的非穷举模式。 我的想法是:一个接一个地读取标记,然后确定它是运算符还是操作数。如果是操作数,则不要将任何节点保存到树中,并将数字存储到堆栈中。否则,我用操作符创建一个节点,从堆栈中弹出符号,将它们设置为新节点的子节点,并将操作符推送到堆栈中。 如果字符串列表为