как развернуть узел Хаффмана после сжатия - PullRequest
0 голосов
/ 14 мая 2019

Я свел все узлы Хаффмана в один узел и пытаюсь построить дерево по этому узлу и создать код для каждого символа (лист Хаффмана), но не могу с этим справиться

Я уже пыталсянаписать метод, но он не работает, потому что он останавливается, когда первый код создается для первого символа

, это мой метод:

    public String createKey(Node node,String s){
        if(node.right==null&&node.left==null) {
            hashMap.put(node, s);
            s="";
        }
        if (node.left!=null)
            return createKey(node.left,s+"0");
        if(node.right!=null)
            return createKey(node.right,s+"1");
        return s;
    }

1 Ответ

0 голосов
/ 17 мая 2019

Обычно лучше иметь один оператор возврата, чем иметь несколько операторов возврата.Ваш код не посещает правильные узлы, потому что вы возвращаетесь до того, как этот код будет достигнут.Примерно так будет посещать каждый узел.Возможно, вам придется немного поиграть с форматированием результатов.

public String createKey(Node node,String s){
    if(node.right == null && node.left == null) {
        hashMap.put(node, s);
        s="";
    }
    if (node.left != null)
        s += createKey(node.left, s + "0");
    if(node.right != null)
        s += createKey(node.right, s + "1");
    return s;
}

Примерно так же будет работать и, возможно, будет проще форматировать результаты:

public String createKey(Node node,String s){
    if(node.right == null && node.left == null) {
        hashMap.put(node, s);
        s="";
    }
    else if (node.left != null && node.right != null)
       s = createKey(node.left, s + "0") + " " + createKey(node.right, s + "1");
    else if (node.left != null)
        s = createKey(node.left, s + "0");
    else if(node.right != null)
        s = createKey(node.right, s + "1");
    return s;
}
...