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

时间:2014-11-30 19:17:26

标签: c++ pointers huffman-code

我正在编写霍夫曼编码算法,我的指针有问题。这是我的代码:

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;
};

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

1 个答案:

答案 0 :(得分:0)

您遇到此问题,因为您没有正确使用指针。看,你在堆栈上创建两个TreeNode,然后你拿走他们的地址,让他们成为新节点的孩子。但是,因为它们处于堆栈状态,所以它们具有相同的地址。所以左右儿童都会指向同一个位置。

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