我目前正在使用优先级队列创建一个霍夫曼树。 我理解霍夫曼树如何工作的概念,但是在实现它时我发现很难生成代码。
目前我有这个:
public void CreateHuffmanTree(String[] symbols, int[] frequencies)
{
PriorityQueue PQ = new PriorityQueue();
for (int i = 0; i < symbols.length; i++)
{
BSTNode temp = new BSTNode(symbols[i]);
PQ.AddItem(temp, frequencies[i]);
}
do
{
BSTNode hold = new BSTNode();
int intHold = (PQ.QueueArray[0].priority + PQ.QueueArray[1].priority);
hold.data = Integer.toString(intHold);
hold.leftChild = new BSTNode(PQ.GetNextItem().toString());
hold.rightChild = new BSTNode(PQ.GetNextItem().toString());
PQ.AddItem(hold, intHold);
} while (PQ.queueSize > 1);
System.out.println(PQ.GetQueueSize());
}
然而,当我测试代码时,它产生了这个:
我的PQ.GetNextItem()返回一个包含Node数据的对象,在我的测试用例中它是诸如“A”或“G”等字母。所以我用.toString()将它转换为字符串然后创建一个新的BSTNode。
任何人都可以解释为什么我的BST没有形成它应该的方式吗?
答案 0 :(得分:0)
我无法肯定地说(并且我没有足够的代表可悲地评论)而没有看到你正在使用的代码,但我有一个理论:
您使用自己的PriorityQueue
吗?如果是这样,我想您可能忘记返回节点的内容,而是返回一个节点 - 这可以解释为什么PQ.getNextItem().toString()
返回&#34; ads2.PQNode@1cfe4b2" ;,因为它意味着您回复ads2.PQNode
对象,我认为这不是您的预期行为。