C中的N叉树

Posted

技术标签:

【中文标题】C中的N叉树【英文标题】:N-ary trees in C 【发布时间】:2010-09-16 10:24:28 【问题描述】:

哪一个是 C 语言中 N-ary 树的简洁实现?

特别是,我想实现一个 n-ary 树,而不是自平衡树,每个节点中的子节点数量不受限制,其中每个节点都包含一个已经定义的结构,例如:

struct task 
  char command[MAX_LENGTH];
  int required_time;
;

【问题讨论】:

N-ary 是指扇出度为 N 的树?您必须指定更多,例如非自平衡搜索树、trie、B-tree 等。 你是对的,我将编辑问题以添加更多细节。谢谢!也感谢 Matt J 的回答! 【参考方案1】:

任何 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】:

作为第一遍,您可以简单地创建一个 struct(我们称之为 TreeNode),它包含一个 task,以及一个TreeNodes 的指针集。这个集合可以是一个数组(如果 N 是固定的)或链表(如果 N 是可变的)。链表需要你声明一个额外的 struct(我们称之为 ListNode),并带有一个指向实际子节点的 TreeNode 指针(部分树),以及指向列表中下一个 ListNode 的指针(如果在列表末尾,则为 null)。

它可能看起来像这样:

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;
;

【讨论】:

以上是关于C中的N叉树的主要内容,如果未能解决你的问题,请参考以下文章

二叉树中的权值是啥?

二叉树中的最大路径和

c_cpp [tree] [path]二叉树中的最大和路径。返回路径。

leetcode-124-二叉树中的最大路径和

c_cpp 给定二叉树,找到最大路径总和。路径可以在树中的任何节点处开始和结束。

124,二叉树中的最大路径和