如何遍历树以从HuffmanTree生成二进制代码?

时间:2018-12-13 16:13:53

标签: python tree compression huffman-code

我正在尝试从霍夫曼树制作二进制代码。我被树遍历困住了。为了遍历树并为每个字符频率打印代码,我编写了以下代码。

def printCode(node,prefix=""):
    if node.left:
        prefix = prefix+"0"
        printCode(node.left,prefix)
    elif node.right:
        prefix = prefix+"1"
        printCode(node.right,prefix)
    elif node.internal ==False:
        print(node.data,prefix)
        printCode(node,prefix="") #need change 

以下是必要的说明: 如果一个节点不是内部节点(node.internal = False),那么它是一片叶子,在遍历的这一点上,我将使用字符频率打印代码。但是我无法返回到先前的内部节点,并继续进行尚未遍历的树的另一个分支。因此,此代码以仅返回树的第一片叶子的二进制代码结束。

树的每个节点都是用以下代码创建的:

class Node:
    def __init__(self,data,internal=False):
        self.data = data  #frequency of a char
        self.internal = internal

        self.left = None
        self.right = None

1 个答案:

答案 0 :(得分:1)

您的逻辑的主要问题是使用elif

def printCode(node):
    if node.left:
        node.left.prefix = node.prefix+"0"
        printCode(node.left)

    if node.right:
        node.right.prefix = node.prefix+"1"
        printCode(node.right)

    if node.internal == False:
        print(node.data,node.prefix)

这样,它将遍历树的左侧直到到达叶子为止,当到达叶子时,它将打印节点数据。在代码的这一点上,它返回到最后一个递归调用(叶之前的节点),并且将转到正确的节点,如果此正确的节点是叶,它将打印出其节点信息,然后它将返回到最后一个递归调用

让我知道您是否需要更好的解释,或者是否有误解,但这并不能满足您的要求

更新:

class Node:
    def __init__(self,data,internal=False):
        self.data = data  #frequency of a char
        self.internal = internal

        self.left = None
        self.right = None

        #Add a prefix to your nodes, so each node keeps track of its own prefix
        self.prefix = ""
相关问题