Java实现一种递归方法,该方法遍历树分支以生成位代码(哈夫曼编码)

Java实现一种递归方法,该方法遍历树分支以生成位代码(哈夫曼编码),java,binary-tree,huffman-code,Java,Binary Tree,Huffman Code,给定一个二叉树,我想开发一个递归方法,根据树的根查找特定字符的位代码(参见图表) 假设您有一个树类,其中每棵树都有4个字段[左树、右树、左叶、右叶],其中每个分支要么指向另一棵树,要么指向一片叶(char值) 然而,我的上述方法并没有像预期的那样有效。如何重写它以使其正确显示位代码?当您解码时,即从二进制代码转换为字符时,您将树从根向叶走 当你编码时,你必须有一个字符叶子的索引,然后你可以查找,然后让每个树节点指向它的父节点,这样你可以在从叶子到根的过程中(向后)生成代码,或在构建编码树时,您

给定一个二叉树,我想开发一个递归方法,根据树的根查找特定字符的位代码(参见图表)

假设您有一个树类,其中每棵树都有4个字段[左树、右树、左叶、右叶],其中每个分支要么指向另一棵树,要么指向一片叶(char值)


然而,我的上述方法并没有像预期的那样有效。如何重写它以使其正确显示位代码?

当您解码时,即从二进制代码转换为字符时,您将树从根向叶走


当你编码时,你必须有一个字符叶子的索引,然后你可以查找,然后让每个树节点指向它的父节点,这样你可以在从叶子到根的过程中(向后)生成代码,在构建编码树时,您可以遍历一次编码树,并构建一个编码表,其中对于每个可能的输入字符,您都有要发出的最终哈夫曼代码。

问题在于,您没有处理在子树中找不到目标的情况。即使在左树中找不到目标,
b+=“0”+遍历(t.lefttree,target,b)将被执行。当您遍历正确的树时,也可以这样说。事实上,即使在左树中已经找到目标,您的方法也将遍历右树。添加赋值运算符的使用进一步说明了这个问题

还请注意,此函数不需要参数
字符串位代码

public static String findBitcode(Tree t, char target){

    // See if target immediately available
    if (t.leftleaf == target) return "0";
    if (t.rightleaf == target) return "1";

    // Search deeper
    String leftResult = findBitcode(t.leftree, target);
    if (leftResult != null) return "0" + leftResult;
    String rightResult = findBitcode(t.righttree, target);
    if (rightResult != null) return "1" + rightResult;

    // Not found
    return null;

}

如果每个节点都没有“父节点”,而只有子节点,那么如何执行此操作?仍然可以这样编码吗?+1用于正确回答问题。然而,这个问题是有缺陷的,因为这是一种可怕的编码方式。每次都在找树?OP应该遍历整个树一次,并构建一个由符号索引的表,以返回位字符串。然后使用该表进行编码。正如图中所示的表格。
public static String findBitcode(Tree t, char target){

    // See if target immediately available
    if (t.leftleaf == target) return "0";
    if (t.rightleaf == target) return "1";

    // Search deeper
    String leftResult = findBitcode(t.leftree, target);
    if (leftResult != null) return "0" + leftResult;
    String rightResult = findBitcode(t.righttree, target);
    if (rightResult != null) return "1" + rightResult;

    // Not found
    return null;

}