2016-01-17 3 views
0

Я пытаюсь написать алгоритм обхода предзаказов на двоичном дереве с использованием рекурсивного метода. Вот что у меня есть:Как выполнить предварительный обход в Java?

void traverse(BT t) { 
     if (t == null){ 
      return; 
     } 

     System.out.print(t); 
     traverse(t.left); 
     traverse(t.right); 
     } 

Это не компилируется по некоторым причинам. Я думаю, что проблема связана с остальной частью моего кода. Вот весь код:

class ZOrep extends TreeAndRepresentation { 
    private int k; 
    ZOrep left; 
    ZOrep right; 
    ZOrep(int m, int[] b) { // given sequence build tree 
    super(m, b); 
    N = (M-1)/2; 
    k = -1; 
    t = build(); 
    } 
    ZOrep(int n, BT t) { // given tree build sequence 
     super(n, t); 
     t = build(); 
     traverse(t); 
    } 
    BT build() { 
     return(a[++k] == 0 ? null : new BT(build(), build())); 
    } 

    void traverse(BT t) { 
    if (t == null){ 
     return; 
    } 

    System.out.print(t); 
    traverse(t.left); 
    traverse(t.right); 
    } 
} 

Я чувствую, что я что-то отсутствует, когда я строю дерево (с моим методом ZOrep). Также есть класс BT:

class BT { 
    BT L; BT R; 
    BT(BT l, BT r) { L = l; R = r; } 
} 

В настоящее время мой компилятор говорит, что он не может найти символ для t.left и t.right.

ответ

1

В настоящее время мой компилятор говорит, что не может найти символ для t.left и t.right.

Это потому, что t является BT и не имеет left и right.

Я предлагаю вам решить, что вы хотите назвать своим классом узлов дерева. Это ZOrep или BT и используйте только один из них или вы создадите путаницу.

System.out.print(t); 

Если вы хотите распечатать BT, вам нужно будет добавить метод toString() к нему, как по умолчанию не будет сказать вам что-нибудь полезное.

2

Когда компилятор говорит, что не может найти символ, это означает, что поле, которое вы пытаетесь ссылаться, не существует.

Глядя на ваш класс BT, это правильно; BT не имеет left или right, он имеет L и R. Таким образом, замена

traverse(t.left); 
traverse(t.right); 

с

traverse(t.L); 
traverse(t.R); 

будет решить эту проблему.

0

Что вы переходите в свою поперечную функцию? Если это объект BT, то вы не можете использовать левый и правый, вы должны использовать L и R. Слева и справа находятся части вашего объекта, которые простираются от BT, но похоже, что вы проходите в BT.

Смежные вопросы