我正试图从头开始实施一个树。 在这种情况下,我想用C#Java或C ++来做。 (不使用内置方法)
因此每个节点将存储一个字符,每个节点最多有26个节点。
我将使用什么数据结构来包含指向每个节点的指针?
基本上我正在尝试从头开始实现基数树。
谢谢,
答案 0 :(得分:4)
我将使用什么数据结构来包含指向每个节点的指针?
节点。每个节点都应该引用树中的(最多)26个其他节点。在Node中,您可以将它们存储在数组,LinkedList,ArrayList或您可以想到的任何其他集合中。
答案 1 :(得分:1)
这并不重要。您可以使用链接列表,数组(但这将具有固定大小),或使用您的语言的标准库中的列表类型。
使用List /数组意味着要进行一些索引簿保存以遍历树,因此最简单的方法就是保持对父级子项的引用。
答案 2 :(得分:1)
这是我最近发现的一个不太糟糕的树API - 虽然我需要图表,但是看看如何设置它来分离它所持有的数据的数据结构是很方便的,所以你可以有一个等价的树迭代器导航树,等等。
https://jsfcompounds.dev.java.net/treeutils/site/apidocs/com/truchsess/util/package-summary.html
答案 3 :(得分:1)
如果你真的对速度比空间更感兴趣,并且如果每个节点只代表一个字母(隐含的最大值为26),那么我只使用26个插槽的简单数组,每个插槽引用一个“节点”( Node是包含数组的对象。)
固定大小的数组的好处是你的查找速度会快得多。如果你查找的char“c”已经保证是一个较低的套装字母,那么查找就像这样简单:
nextNode=nodes[c-'a'];
对字符串进行递归查找是微不足道的。
答案 4 :(得分:1)
你描述的不是完全一个基数树...在基数树中,你可以在一个节点中有多个字符,而且孩子的数量没有上限节点。
您所描述的内容听起来更受限于字母...每个节点可以是az,后面可以跟另一个字母,az等。这种区别对于您选择保留下一个字母的数据结构至关重要 - 节点指针。
在你描述的树中,最简单的结构可能是一个简单的指针数组......你需要做的就是将字符(例如'A')转换为ascii值('65'),并且减去起始偏移量(65)以确定您想要的“下一个节点”。占用更多空间,但插入和遍历非常快。
在真正的基数树中,您可以拥有3个,4个,78个或0个子节点,并且“下一个节点”列表将具有排序,插入和删除的开销。慢得多。
我不能说Java,但如果我在C#中实现自定义基数树,我会使用其中一个内置的.NET集合。编写自己的排序列表并不能真正帮助您学习树概念,并且.NET集合的内置优化很难实现。然后,您的代码很简单:查找下一个节点;如果存在,抓住它去;如果没有,请将其添加到下一个节点集合。
您使用哪个集合取决于您通过树实际执行的内容...每种类型的树都需要在插入时间,查找时间等之间进行权衡。您所做的选择取决于对应用程序最重要的内容,不是树。
有意义吗?
答案 5 :(得分:1)
感谢您的快速回复。
是的,snogfish说是正确的。 基本上,它的树有26个节点(A-Z)+一个bool是终结者。
每个节点都有这些值,它们相互链接。
我还没有深入学习指针,所以今天我尝试使用C#中的不安全代码从头开始实现这一点。
因此,如果有人能够使用内部树类为我提供开始使用C#的代码,我将不胜感激。一旦我开始它,我可以将算法移植到其他语言,只需将其更改为使用指针。
非常感谢, 迈克尔
答案 6 :(得分:0)
查看这个Simeon Pilgrim博客,“Code Camp Puzzle Reviewed”。其中一个解决方案使用C#中的Radix,您可以下载解决方案。