2010-07-22 10 views
1

Salut im essayant de comprendre comment rechercher récursivement un arbre pour trouver un caractère et le code binaire pour arriver à ce caractère. Fondamentalement, le but est d'aller chercher le code du personnage, puis de l'écrire dans un fichier. la partie de l'auteur de fichier que je peux ne faire aucun problème mais le vrai problème met le code binaire dans une chaîne. pendant que je cherche le personnage. aidez s'il vous plaît!Recherche récursive d'un arbre pour obtenir le codage binaire d'un caractère

c'est le code de la méthode récursive:

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; 


} 

et c'est la classe de fréquence:

package huffman; 

public class Fréquence implémente Comparable {private String s; private int n; public Fréquence restante; public Droit de fréquence; private Chaîne biNum; private Feuille de chaîne;

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); 

} 

}

Répondre

1

Dans votre version mise à jour, je pense que vous devriez réexaminer return biNum(root.left, temp, letter);. Plus précisément, que se passe-t-il si le nœud racine de l'arbre entier a un enfant gauche qui n'est pas une feuille (et donc root.left.getString() == null) mais que la valeur que vous recherchez descend du bon enfant du nœud racine de l'arbre entier.

Considérez cet arbre, par exemple:

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

et trace les étapes de votre fonction suivra la recherche de la lettre C.

Peut-être que vous devriez considérer traverser l'arbre entier (et la construction du modèle de 1s et 0s comme vous allez) sans chercher une lettre spécifique mais en prenant une action particulière quand vous trouvez un nœud de feuille?