1

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

这是递归方法的代码:

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;

公共类频率实现 Comparable { private String s; 私人诠释 n; 公共频率离开;公共频率权;私有字符串双数;私有字符串叶;

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

}

}

4

1 回答 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。

也许您应该考虑遍历整个树(并在您前进的过程中建立 1 和 0 的模式)而不寻找任何特定的字母,而是在找到叶节点时采取特定的行动?

于 2010-07-23T01:59:25.930 回答