我创建了一种方法来计算作为methods参数的值的频率。我创建了一个二叉树并将值放入其中,我现在尝试计算所有等于参数的值。 问题是我得到一个无限循环,任何人都可以看到原因:
public int counter(T value)
{
if (value == null) return 0;
Node<T> p = root, q = null; // q is the parent of p
int values = 0;
while (p != null) // checks p
{
int cmp = comp.compare(p.value,value);// compares
if(p.value.equals(value))
{
values++;
}
if (cmp < 0) { q = p; p = p.left; } // goes left in the tree
else if (cmp > 0) { q = p; p = p.rigth; } goes right in the tree
if ( p == null) return values;
}
return 0; // if no values found in the tree
}
构造
private Node(T value, Node<T> l, Node<T> r)
{
this.value = value;
left = l; right = r;
}
答案 0 :(得分:1)
当你找到一个匹配的值时,你会增加计数器,但不会改变p
,所以你之后会永远停留在同一个节点上。
树可以包含多个值实例的任何解决方案都必须是递归的。只需绘制一个树,例如6个特定值的实例,然后浏览代码。你必须在那一点看两个子树,所以递归是唯一的方法来实现这一点(或者,你可以使用父指针堆栈,我想,但递归是这么多清洁器)。
答案 1 :(得分:0)
感谢您的回答!我不擅长树或递归方法,但这是我的尝试,我得到堆栈溢出所以这又是一个无限循环。但我只是不知道如何解决这个问题。
public int counter(T value)
{
if (value == null) return 0;
Node<T> p = root, q = null;
int countervalues = 0;
if(p.value.equals(value))
{
countervalues++;
}
if(p.left!=null) p = p.left; counter(value);
if(p.right!=null) counter(value);
if(p.left == null && p.left == null)
return countervalues;
return 0;
}