为什么将k-ary树表示为左子,右兄弟树?

时间:2015-03-19 06:07:57

标签: java c algorithm tree binary-tree

我正在阅读流行的算法入门书(CLRS),它继续使用left child, right sibling method创建k-ary树,但我没有看到使用这种方法的好处。它声明我们可以在k无界时使用这种方法(我们不知道任何父母可能提前拥有的子女数量)。它还指出,即使子k的数量受一个大常数的约束,但大多数节点只有很少的子节点,我们可能会浪费大量的内存空间。

对我而言,这似乎不对。在C / C ++ / Java中,您可以创建Node类型的结构或类来表示节点的结构。在该结构或类中,您创建一个类型的数组(C / C ++的指针)Node,然后通过为C / C ++中的更多指针重新分配更多内存或创建具有更多空间和移动的新数组,您可以表示无限数量的子节点需要时,Java中的指针(引用)结束。

如果我们唯一的选择是在节点的struct / class代表中创建Node类型的单个指针/引用,那么我可以看到如何创建一个k-ary,其中k是无界的或者k是有界的一个大常数,我们最终浪费空间。但是,我们有可以为此目的动态调整大小的数组。我错了吗?这有什么意义呢?

1 个答案:

答案 0 :(得分:1)

你是对是错。原则上,我认为这本书指的是为孩子们保留一个固定大小的数组的区别。

我们确实拥有能够增长的动态数组,但它们通常始终分配一个默认大小的数组(后来通常在需要更多空间时将其加倍),因此仍会有一小部分内存被浪费

如果您使用单个链表,那么您基本上会采用与左子,右兄弟方法相同的方式。

当然,这些都不是"错误",它们只是有更新,插入,删除等行为。与任何数据结构一样。