代码之家  ›  专栏  ›  技术社区  ›  mmutilva

C中的N元树

  •  17
  • mmutilva  · 技术社区  · 18 年前

    C语言中N元树的一个巧妙实现是什么?

    具体来说,我想实现一个n元树,而不是自平衡树,每个节点中都有未绑定数量的子节点,其中每个节点都包含一个已经定义的结构,例如:

    struct task {
      char command[MAX_LENGTH];
      int required_time;
    };
    
    2 回复  |  直到 18 年前
        1
  •  13
  •   Matt J Jørgen Fogh    18 年前

    任何n元树都可以表示为二叉树,其中在每个节点中,左指针指向第一个子节点,右指针指向下一个子节点。

                 R                        R
               / | \                      |
              B  C  D                     B -- C -- D
             / \    |                     |         |
            E   F   G                     E -- F    G
    

    所以,你的情况是:

    struct task {
      char command[MAX_LENGTH];
      int required_time;
    };
    
    struct node {
      struct task taskinfo;
      struct node *firstchild;
      struct node *nextsibling;
    };
    

    这种技术的优点是,许多算法更容易编写,因为它们可以在二叉树上表示,而不是在更复杂的数据结构上表示。

        2
  •  52
  •   Remo.D    18 年前

    作为第一步,你可以简单地创建一个 结构 (我们称之为 树节点 )其中包含a 任务 ,以及一组指向 树节点 s.此集合可以是数组(如果 N 固定)或链表(如果 N 是可变的)。链接列表将要求您申报额外的 结构 (我们称之为 列表节点 )与a 树节点 指向实际子节点(树的一部分)的指针和指向下一个子节点的指针 列表节点 在列表中( 无效的 如果在列表末尾)。

    它可能看起来像这样:

    struct task {
      char command[MAX_LENGTH];
      int required_time;
    };
    
    struct TreeNode;
    
    struct ListNode {
      struct TreeNode * child;
      struct ListNode * next;
    };
    
    struct TreeNode {
      struct task myTask;
      struct ListNode myChildList;
    };
    
    推荐文章