繁体   English   中英

从头开始实现树

[英]Implementing a tree from scratch

我试图通过从头开始实现一个来学习树。 在这种情况下,我想用C#Java或C ++来做。 (不使用内置方法)

因此每个节点将存储一个字符,每个节点最多有26个节点。

我将使用什么数据结构来包含指向每个节点的指针?

基本上我正在尝试从头开始实现基数树。

谢谢,

我将使用什么数据结构来包含指向每个节点的指针?

一个节点。 每个节点都应该引用树中的(最多)26个其他节点。 在Node中,您可以将它们存储在数组,LinkedList,ArrayList或您可以想到的任何其他集合中。

这并不重要。 您可以使用链接列表,数组(但这将具有固定大小),或使用您的语言的标准库中的列表类型。

使用List /数组意味着要进行一些索引簿记来遍历树,因此最简单的方法是只使用对父项中子项的引用。

这是我最近发现的一个不是一个糟糕的树API - 虽然我需要图表,看看如何设置它来分离它所持有的数据的数据结构是很方便的,所以你可以有一个等价于Iterator的树。浏览树,等等。

https://jsfcompounds.dev.java.net/treeutils/site/apidocs/com/truchsess/util/package-summary.html

如果你实际上对速度比空间更感兴趣,并且如果每个节点只代表一个字母(隐含最多26个),那么我只使用一个简单的26个插槽阵列,每个插槽引用一个“节点”(节点是包含数组的对象)。

固定大小的数组的好处是你的查找速度会快得多。 如果你查找的char“c”已经保证是一个较低的套装字母,那么查找就像下面这样简单:

nextNode=nodes[c-'a'];

对字符串的递归查找将是微不足道的。

你描述的不是基数树......在基数树,你可以在一个节点的多个字符,且有上子节点的数量没有上限。

您所描述的内容听起来更受限于字母...每个节点可以是az,后面可以跟另一个字母,az等。这种区别对于您选择保存下一个节点指针的数据结构至关重要。

在您描述的树中,最简单的结构可能是一个简单的指针数组......您需要做的就是将字符(例如'A')转换为其ascii值('65'),然后减去起始值offset(65)确定你想要的“下一个节点”。 占用更多空间,但插入和遍历非常快。

在真正的基数树中,您可以有3个,4个,78个或0个子节点,并且“下一个节点”列表将具有排序,插入和删除的开销。 慢得多。

我不能说Java,但如果我在C#中实现自定义基数树,我会使用其中一个内置的.NET集合。 编写自己的排序列表并不能真正帮助您学习树概念,并且.NET集合的内置优化很难实现。 然后,您的代码很简单:查找下一个节点; 如果存在,抓住它去; 如果没有,请将其添加到下一个节点集合中。

您使用哪个集合取决于您通过树实现的具体内容......每种类型的树都需要在插入时间,查找时间等之间进行权衡。您所做的选择取决于对应用程序最重要的是什么,而不是树。

说得通?

感谢您的快速回复。

是的,snogfish说是正确的。 基本上,它的树有26个节点(AZ)+一个bool是终结者。

每个节点都有这些值,它们相互链接。

我还没有深入学习指针,所以今天我尝试使用C#中的不安全代码从头开始实现这一点。

因此,如果有人能够使用内部树类为我提供开始使用C#的代码,我将不胜感激。 一旦我开始它,我可以将算法移植到其他语言,只需将其更改为使用指针。

非常感谢,迈克尔

看看这个Simeon Pilgrim博客,“ Code Camp Puzzle评论 ”。 其中一个解决方案使用C#中的Radix,您可以下载解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM