在这里问了一个类似的问题:[BST with duplicates
用户Sazzadur Rahaman发布了完成BST重复的三个场景,但我需要知道如何实现他提到的第三种情况,如下所示:
假设我们正在使用输入:"RABSAB."
括号中带有计数器变量的树将如下所示:
R(1)
/ \
/ \
A(2) S(1)
\
\
B(2)
基本上,我希望每个元素(节点)都有一个特定的计数器变量。
我试图在我的插入方法中实现的是什么?或者我需要在我的BSTTree / Node类中使用某种其他方法吗?
****编辑**我的BSTNode课程,根据Compass's
推荐进行了更改。
public class BSTNode {
String key;
BSTNode left, right;
int count=1;
public BSTNode(String key) {
this.key = key;
}
public void insert(String x) {
if (x.compareTo(this.key) > 0) {
if (right != null) {
right.insert(x);
} else {
right = new BSTNode(x);
}
} //Go right
else if (x.compareTo(this.key) < 0) {
if (left != null) {
left.insert(x);
} else {
left = new BSTNode(x);
}
} //Go left
else if (x.compareTo(this.key) == 0) {
count++;
} // It's a duplicate, update the count
}
}
编辑,更新我的输出递增计数器,似乎没有提供正确的输出,我插入"RABSAB"
并尝试计算数量重复的节点。
插入如下:
String line = "R A B S A B";
String[] words = line.split(" ");
for (int i = 0; i < words.length; i++) {
t1 = t1.Insert(words[i], t1);
System.out.println(words[i] + " : " + t1.count);
}
我得到以下输出:
R : 1
A : 1
B : 1
S : 1
A : 1
B : 1
感谢大家的时间。
答案 0 :(得分:0)
在BSTNode类中,在Insert方法之外,声明int counter = 1;
然后,在你的其他地方,你会做counter++;
因此,在创建节点时,您将拥有1个元素(因为您创建了它,您知道它存在)。
当找到匹配的其他键时,您将增加计数器。
我觉得你的Insert方法存在一个实现问题(遵循约定应该是小写的insert
)。你正在传递一个Node t,我认为它是Node的子节点。这可能应该被声明为一个字段,就像counter一样。
具有重复项的伪编码基于整数的节点
public class Node() {
int value; //node's value
int counter = 1; //how many items of same type at node
Node leftChild = null;
Node rightChild = null;
public Node(int value) {
this.value = value;
}
public void insert(int newValue) {
if(newValue > value) {
if(rightChild != null)
rightChild.insert(newValue); //we tell the child to deal with it
else
rightChild = new Node(newValue); //we make it a child
}
else if(newValue < value) {
if(leftChild != null)
leftChild.insert(newValue);
else
leftChild = new Node(newValue);
}
else if(newValue == value) {
counter++; // we found a duplicate, increase count
}
}
}
答案 1 :(得分:0)
这样可行。
else {
t.count++;
}
return t;