2013-03-27 78 views
2

我正在制作一个二叉树,当我向树中添加一个新的字符串节点时,我必须先搜索以查看该节点是否已经存在。如果是这样,我需要将其值增加1,而不是将其添加到其他节点。我需要一个数据结构来保存两种数据类型

哪个数据结构最适合这样做?

+1

只需要一个带有字符串和计数器的节点类。 – 2013-03-27 18:33:59

+0

任何DataStructure都可以工作,它只关心你如何读取字符串并在最后附加一个Integer。所以即使是一个带整数前缀的字符串也可以工作 – 2013-03-27 18:36:10

+0

是真的,但我不清楚这是“最好的”。 – pamphlet 2013-03-27 18:37:13

回答

1

除非我误解了你,否则你的问题很简单。只需创建一个包含两个成员变量的类:

public class Node { 
    v1 data_type_1; 
    v2 data_type_2; 
} 

将此用作二叉树的节点。

+2

这个答案很好,但是如果Node包含命名为String和int的成员 – pamphlet 2013-03-27 18:38:44

0

咦,本质上也许

https://github.com/JohannesLichtenberger/sirix/tree/master/bundles/sirix-core/src/main/java/org/sirix/index/avltree

帮助。这是一个AVLTree的实现,它是一个平衡的二叉树。我会用泛型类型(和我)来实现它,这样你也可以存储其他内容。

在我的情况下,它被用作索引结构,它应该能够被存储在大部分的主内存中(但也包括使用版本控制算法的磁盘表示)。我正在存储一个字符串/路径组合(键)和一组简单的属于路径(值)的ID。

但是,您可能必须将两个“指针”存储到两个子节点或两个节点对象的内存中引用。

编辑:您可能还需要从谷歌番石榴即将BinaryTreeTraverser一眼:https://code.google.com/p/guava-libraries/source/browse/guava/src/com/google/common/collect/BinaryTreeTraverser.java

1

巴尼的回答是好。但要更具体地回答您的问题,您可能希望节点类看起来像:

public class Node 
{ 
    String value; 
    int count; 

    Node leftChild; 
    Node rightChild; 
} 

您将为您的树创建这些实例。其中一个例子就是“根”。所有其他实例将通过leftChildrightChild直接或间接挂起。

祝你好运!

0

所以结构的座右铭是通过减少重复次数来减少内存。并按排序顺序存储数据。

然后这个节点可以用于你的树。

public class node 
{ 
    String value; 
    int count; 
    node left; 
    node right; 
} 

但还有更好的解决方案,然后这甚至是TreeMap的,因为这里搜索需要O(1)(重复计数增量相当于搜索)在前面的情况下为O(日志(N))。

Map testTreeMap = new TreeMap(); 
if(testTreeMap.get(MyString)!=null) 
{ 
testTreeMap.put(MyString, testTreeMap.get(MyString) +1) 
} 
else 
{ 
testTreeMap.put(MyString , Integer(count)) // count=1 
} 

有了这个,你完全完成了..!

http://tutorialswithexamples.com/java-treemap-tutorial-and-examples/