2013-11-19 2 views
0

Im, создающий метод подсчета частоты значения, являющегося параметром методов. Я создал двоичное дерево и ввел в него значения, im теперь пытается подсчитать все значения, равные параметру. Проблемы заключается в получении им бесконечный цикла, может кто-нибудь понять, почему:Частота подсчета общего объекта в двоичном дереве

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 
    } 

Constructor:

private Node(T value, Node<T> l, Node<T> r) 
    { 
     this.value = value; 
     left = l; right = r; 
    } 

ответ

1

Если вы нашли соответствующее значение вы увеличиваете счетчик, но затем не изменяется p, так вы застряли на том же узле навсегда после этого.

Любое решение, в котором дерево может содержать более одного экземпляра значения, должно быть рекурсивным. Просто нарисуйте дерево с, скажем, 6 экземплярами определенного значения и пройдите через свой код. Вы должны посмотреть на поддеревами в этой точке, поэтому рекурсия - это единственный способ сделать это легко (или вы могли бы использовать стек родительского указателя, я полагаю, но рекурсия настолько чище).

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; 
    } 
Смежные вопросы