Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从头开始实现树_C#_Java_Pointers_Tree_Binary Tree - Fatal编程技术网

C# 从头开始实现树

C# 从头开始实现树,c#,java,pointers,tree,binary-tree,C#,Java,Pointers,Tree,Binary Tree,我试图通过从头开始实现一个来了解树。 在这种情况下,我想用C++或java语言来做。(不使用内置方法) 因此,每个节点将存储一个字符,每个节点最多有26个节点 我将使用什么数据结构来包含指向每个节点的指针 基本上,我尝试从头实现一个基数树 谢谢 我将使用什么数据结构来包含指向每个节点的指针 节点。每个节点都应该引用(最多)树中的26个其他节点。在节点内,您可以将它们存储在数组、LinkedList、ArrayList或您能想到的任何其他集合中。这其实并不重要。您可以使用链接列表、数组(但其大小固

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

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

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

基本上,我尝试从头实现一个基数树

谢谢

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


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

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


使用列表/数组意味着执行一些索引簿记来遍历树,因此,只保留对父级中的子级的引用可能是最容易使用的方法。

我最近发现了一个对树来说并不坏的API-尽管我需要图形,但可以方便地看到它是如何设置的,以分离它所持有的数据的数据结构,因此您可以使用一个与迭代器相当的树来浏览树,等等


如果您实际上对速度比空间更感兴趣,并且如果每个节点仅代表一个字母(最大值为26),那么我将使用26个插槽的简单数组,每个插槽引用一个“节点”(节点是包含数组的对象)

固定大小数组的好处是,查找速度会快得多。如果您正在查找已保证为小写字母的字符“c”,则查找将非常简单:

nextNode=nodes[c-'a'];

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

请查看Simeon Pilgrim的博客“”。其中一个解决方案使用C#中的基数,您可以下载该解决方案。

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

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

在您描述的树中,最容易使用的结构可能是一个简单的指针数组。。。您只需将字符(例如“A”)转换为其ascii值(“65”),然后减去起始偏移量(65),以确定所需的“下一个节点”。占用更多空间,但插入和遍历速度非常快

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

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

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


有意义吗?

谢谢您的快速回复

是的,斯诺菲什说的没错。 基本上,它是一个有26个节点的树(a-Z)+一个bool节点

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

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

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

非常感谢,
Michael

在实现角色版本后,您可以更进一步,使您的解决方案更通用,或者角色和26节点限制是否有特定用途?