霍夫曼树 - 所有指针都指向同一位置

Huffman Tree - all pointers pointitng to the same location

本文关键字:位置 指针 霍夫曼      更新时间:2023-10-16

我正在编写霍夫曼编码算法,我在指针方面遇到了问题。这是我的代码:

TreeNode Algorythm::createATreeAndReturnRoot(){
    while (treeNodesList.size() > 1){
        sortLeafs();
        TreeNode lowestF = treeNodesList.front(); treeNodesList.pop_front();
        TreeNode lowestS = treeNodesList.front(); treeNodesList.pop_front();
        TreeNode sum = TreeNode(&lowestF, &lowestS);
        tree.push_back(lowestF);
        tree.push_back(lowestS);
        tree.push_back(sum);
        treeNodesList.push_back(sum.item);
    }
    return tree.at(tree.size()-1);
}

和 TreeNode 构造函数:

TreeNode::TreeNode(TreeNode* leftChild, TreeNode* rightChild)
{
    right = rightChild;
    left = leftChild;
    item.setLetter('?');
    item.setLetterCount(leftChild->item.getLetterCount() + rightChild->item.getLetterCount());
}
class TreeNode
{
public:
    TreeNode();
    TreeNode(TreeNode* leftChild, TreeNode* rightChild);
    ~TreeNode();
    TreeNode::TreeNode(TreeNode* treeNode);
    TreeNode::TreeNode(TreeItem treeItem);
    bool isLeaf();
    bool hasLeftChild();
    bool hasRightChild();
    bool operator< (TreeNode &other);
    TreeItem item;
    TreeNode *left;
    TreeNode *right;
};

最后,我有一棵树,根的字母计数正确,但树中左右的所有指针都指向同一位置(根的子级)。

您遇到此问题是因为您没有正确使用指针。看,您在堆栈上创建了两个TreeNode,然后获取它们的地址,并使它们成为新节点的子节点。但是,因为它们在堆栈上,所以它们具有相同的地址。所以所有的左子项和右子项都将指向同一位置。

您可能希望使用 newshared_ptr 在堆上分配它们。