2010-07-22 3 views
1

Привет, я пытаюсь выяснить, как рекурсивно искать дерево, чтобы найти символ и двоичный код, чтобы добраться до этого символа. в основном цель состоит в том, чтобы найти код для символа, а затем записать его в файл. часть файлового автозапуска я не создаю проблем, но реальная проблема заключается в том, чтобы вставить двоичный код в строку. в то время как im ищет символ. пожалуйста помоги!Рекурсивно искать дерево, чтобы получить двоичное кодирование для символа

это код для рекурсивного метода:

public String biNum(Frequency root, String temp, String letter) 
{ 
    //String temp = ""; 
    boolean wentLeft = false; 
    if(root.getString() == null && !wentLeft) 
    { 
     if(root.left.getString() == null) 
     { 
      temp = temp + "0"; 
      return biNum(root.left, temp, letter); 
     } 
     if(root.left.getString().equals(letter)) 
     { 
      return temp = temp + "0"; 
     } 
     else 
     { 
      wentLeft = true; 
      temp = temp.substring(0, temp.length() - 1); 
      return temp; 
     } 
    } 
    if(root.getString() == null && wentLeft) 
    { 
     if(root.right.getString() == null) 
     { 
      temp = temp + "1"; 
      return (biNum(root.right, temp, letter)); 
     } 
     if(root.right.getString().equals(letter)) 
     { 
      return temp = temp + "1"; 
     } 
     else 
     { 
      wentLeft = false; 
      temp = temp.substring(0, temp.length() - 1); 
      return temp; 
     } 

    } 
    return temp; 


} 

и это класс Частоты:

package huffman; 

Frequency общественного класса реализует Сопоставимые { частная строка s; private int n; Публичная частота слева; общественное право частоты; private String biNum; приватный строп лист;

Frequency(String s, int n, String biNum) 
{ 
    this.s = s; 
    this.n = n; 
    this.biNum = biNum; 
} 
public String getString() 
{ 
    return s; 
} 
public int getFreq() 
{ 
    return n; 
} 
public void setFreq(int n) 
{ 
    this.n = n; 
} 
public String getLeaf() 
{ 
    return leaf; 
} 
public void setLeaf() 
{ 
    this.leaf = "leaf"; 
} 
@Override 
public int compareTo(Object arg0) { 
    Frequency other = (Frequency)arg0; 

    return n < other.n ? -1 : (n == other.n ? 0 : 1); 

} 

}

ответ

1

В обновленной версии, я думаю, вы должны пересмотреть return biNum(root.left, temp, letter);. В частности, что происходит, если корневой узел всего дерева имеет левый дочерний элемент, который не является листом (и, следовательно, root.left.getString() == null), но искомое вами значение происходит от правого дочернего узла корневого узла всего дерева.

Рассмотрим это дерево, например:

  26 
     /\ 
     / \ 
    / \ 
     11  15 
    /\ /\ 
    / B A \ 
    6  5 6  9 
/\   /\ 
D \   C sp 
3 3   4 5 
    /\ 
    E F 
    2 1 

и проследить шаги ваша функция будет следовать ищет буквы C.

Возможно, вам следует рассмотреть возможность перемещения по всему дереву (и создание шаблона 1s и 0s, когда вы идете), не ища какой-либо конкретной буквы, но предпринимая определенное действие, когда найдете листовой узел?

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