C++ 哈夫曼树-所有指向同一位置的指针

C++ 哈夫曼树-所有指向同一位置的指针,c++,pointers,huffman-code,C++,Pointers,Huffman Code,我正在写哈夫曼编码算法,指针有问题。这是我的密码: TreeNode Algorythm::createATreeAndReturnRoot(){ while (treeNodesList.size() > 1){ sortLeafs(); TreeNode lowestF = treeNodesList.front(); treeNodesList.pop_front(); TreeNode lowestS = treeNodes

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

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::TreeNode(TreeNode*leftChild,TreeNode*righchild)
{
右=右子女;
left=leftChild;
项目.设置字母(“?”);
item.setLetterCount(leftChild->item.getLetterCount()+righchild->item.getLetterCount());
}
三烯类
{
公众:
TreeNode();
TreeNode(TreeNode*左子女,TreeNode*右子女);
~TreeNode();
TreeNode::TreeNode(TreeNode*TreeNode);
TreeNode::TreeNode(TreeItem-TreeItem);
布尔岛();
bool hasleeftchild();
bool hasRightChild();
bool操作员<(TreeNode和其他);
TreeItem项目;
TreeNode*左;
TreeNode*对;
};

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

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


您可能想使用
new
shared\u ptr

在堆上分配它们,如果我从列表中获得代码中的树节点,我如何使用new操作符?好的,我已经让它工作了。我使用了TreeNode*列表,并提供了与TreeNode*单独的比较功能。然后我按照建议在循环中使用指针,效果很好。谢谢