递归搜索树以获得字符的二进制编码

时间:2010-07-22 20:58:56

标签: recursion huffman-code

您好我想弄清楚如何递归搜索树来查找字符和二进制代码来获取该字符。基本上我的目标是找到角色的代码,然后将其写入文件。文件编写器部分我可以没有问题,但真正的问题是将二进制代码放入一个字符串。我正在寻找这个角色。请帮忙!

这是递归方法的代码:

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;


}

这是Frequency类:

package huffman;

public class Frequency implements Comparable {     private String s;     私人的     公共频率离开;     公共频率权利;     private String biNum;     私有String leaf;

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 个答案:

答案 0 :(得分:1)

在您的更新版本中,我认为您应该重新审核return biNum(root.left, temp, letter);。具体来说,如果整个树的根节点有一个不是叶子的左子节点(因此root.left.getString() == null)会发生什么,但是你寻找的值是从整个树的根节点的右子节点下降的。 / p>

考虑这个树,例如:

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

并跟踪您的函数将遵循的步骤,查找字母C.

也许你应该考虑遍历整个树(并且在你去的时候建立1和0的模式),而不是寻找任何特定的字母,而是在找到叶子节点时采取特定的动作?

相关问题