【问题标题】:How to do a tree structure in C如何在 C 中创建树形结构
【发布时间】:2009-11-28 19:12:07
【问题描述】:

我是 C 语言的初学者。但是,我需要一个可以为我解决问题的程序。如何执行以下操作?

我需要一个树形结构。这不是传统的树,因为每片叶子都可以有不同的叶子。因此,每个叶子都应该包含一个包含叶子子节点的链表。在每个链接中都有一个 char[][]-array 和一些 int 变量,它们告诉我们叶子有多好。然后我必须做一些最好的优先搜索来找到最好的 char[][]-array 并输出它。如果我找到了合适的数组,我可以停止 tree walk。

【问题讨论】:

  • 努力学习,加倍努力,当它奏效时快乐!
  • afaik,叶子是没有任何子节点的节点。所以如果一个“叶子”有孩子,它就不是叶子。
  • (S)he 表示每个节点可以有可变数量的子节点。并不是那么罕见。
  • 我认为 node 是任何节点,但 leaf 是没有任何子节点的节点。他特别补充说,这不是一棵传统的树,因为每片叶子都可以有不同的叶子。可能是?他的意思是这不是一棵二叉树(当您学习树时,它是“传统树”)并且每个节点都可以有任意数量的节点作为其子节点 - 我不知道。
  • 是的。它不是二叉树。我从来没有见过叶子在链表上的树,所以这对我来说是新的。我想我需要两个结构,一个用于树,一个用于链表。

标签: c tree


【解决方案1】:

我,我会在插入时保持链表排序,这样你就可以始终返回树节点中的第一个列表项。

类似的东西

struct listnode {
    char** data;
    int quality;
    struct listnode* next;
};

struct treenode {
    struct treenode* left;
    struct treenode* right;
    int key;
    struct listnode* list;
};


struct treenode* tree_insert(struct treenode* root, int key, int quality, char** data)
{
    if(root == NULL) {
        root = treenode_alloc();
        root->key = key;
        root->list = list_insert(root->list, quality, data);
        return root;
    }

    if(key < root->key) {
        root->left = tree_insert(root->left, key, quality, data);
    } else if(key > root->key) {
        root->right = tree_insert(root->right, key, quality, data);
    } else {
      //key == root->key
      root->list = list_insert(root->list, quality, data);
    }
    return root;
}

struct listnode* list_insert(struct listnode* head, int quality, char** data) {
    struct listnode* prev = NULL;
    struct listnode* ins = NULL;
    struct listnode* ptr = NULL;
    if(head == NULL) {
        head = listnode_alloc();
        head->quality = quality;
        head->data = data;
        return head;
    }
    ptr = head;

    while(quality < ptr->quality) {
        if(ptr->next == NULL) { //we reached end of list
            ptr->next = list_insert(NULL, quality, data);
            return head;
        }

        prev = ptr;
        ptr = ptr->next;
    }

    //insertion into middle of list (before ptr, because ptr->quality >= quality)
    ins = listnode_alloc();
    ins->quality = quality;
    ins->data = data;
    ins->next = ptr;
    if(prev) {
        prev->next = ins;
    }
    return head;
}

【讨论】:

    【解决方案2】:

    arrayindex 是位置信息,因此比实际元素更多的信息是索引,arrayelement 是数据,好的关键字fordfulkerssontrie 化学数据模型,经典逻辑的 b-tree,广度优先搜索,concordance dbs,堆结构或即堆栈(LIFO)

    【讨论】:

      【解决方案3】:

      学习数据结构和算法... Wikipedia 是个不错的地方。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-08
        • 1970-01-01
        • 1970-01-01
        • 2016-07-30
        • 2020-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多