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

Python 如何遍历树以从HuffmanTree生成二进制代码?,python,tree,compression,huffman-code,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)

我正试图从哈夫曼树中生成二进制代码。我被困在树上。为了遍历树并打印每个字符频率的代码,我编写了以下代码

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

逻辑的主要问题是使用
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 = ""

你想用
节点.internal
做什么?你只想打印叶子吗?@SPYBUG96如果node.internal==True,那么它就是一个叶子,此时我要打印这个叶子的代码。我想打印叶子和相应的二进制代码。酷,那么我下面的答案应该是解决问题现在程序已经到达每个叶子,但生成错误的二进制代码。对不起。现在不能像在if条件中那样在printCode()中传递两个参数。虽然我已经解决了,但现在它是空的。未添加前缀字符(0或1)。也许你不能帮助我清楚,如果你看我的全部代码。我的要点是:我已经解决了这个问题。我已将if_条件中的前缀更新为node.prefix=node.prefix+“1”。谢谢你帮我找到解决办法。@流亡者很乐意帮忙!