我正在尝试从霍夫曼树制作二进制代码。我被树遍历困住了。为了遍历树并为每个字符频率打印代码,我编写了以下代码。
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
答案 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 = ""