c-将二叉树转换为简单的链表


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/

本文介绍了遍历二叉树的3种简单的深度优先方法(预序、序、后序(。它在C.中也有一个很好的紧凑示例

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

你必须在中进行的唯一修改

void printPreorder(struct node* node)

方法是取代打印节点的数据:

printf("%d ", node->data);

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

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

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

ps:https://www.geeksforgeeks.org/这是一个惊人的资源帽子,为那些家伙的惊人工作!

psps:如果你想在第一次用NULL调用函数时返回错误消息,也就是说,如果没有有效的树传递给遍历,我建议你制作一个包装函数来调用递归函数。然后,在该包装器中,您可以在调用递归方法之前检查传递给它的头是否为NULL。

最新更新