将二进制树转换为简单的链接列表

问题描述 投票:0回答:1
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,你必须把它添加到叶子节点列表中。

然后用左子节点和右子节点递归调用函数。

c data-structures tree binary-tree
1个回答
0
投票

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

本文介绍了3种简单的深度优先方法(preorder, inorder, postorder)来遍历二叉树。它还有一个很好的C语言的紧凑例子。

你提供的伪代码算法实际上是正确的preorder方法。

你唯一要做的修改是在

void printPreorder(struct node* node)

方法是代替打印节点的数据。

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

而是检查该节点是否是叶子,如果是,则将其添加到列表中。

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

当然了 appendList 是我临时创作的,但根据你在问题中提供的代码,你会知道如何添加到link-list中。如果不知道,请随时提问。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.