霍夫曼树 - 所有指针都指向同一位置
Huffman Tree - all pointers pointitng to the same location
我正在编写霍夫曼编码算法,我在指针方面遇到了问题。这是我的代码:
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
,然后获取它们的地址,并使它们成为新节点的子节点。但是,因为它们在堆栈上,所以它们具有相同的地址。所以所有的左子项和右子项都将指向同一位置。
您可能希望使用 new
或 shared_ptr
在堆上分配它们。
相关文章:
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- C++指针数组到字符数组中的特定位置
- 声明指针时更改星号的位置
- 如何在单个链表中交换两个节点的位置,只修改指针
- 当原始数据是常量时,修改指针指向的位置是 UB 吗?
- 如果访问对象,则指向的对象内部的指针会更改内存位置
- 访问违规读取位置传递指针以在c中写入的DLL中起作用
- 如何在内存位置取消指针,并用值启动它
- C++ - 智能指针 - 访问冲突读取位置0xDDDDDDDD
- 最简单的方法使多个指针一次指向同一位置,一次只处理2个位置
- 在指针中保存确定的位置
- 通过在此指针上放置新位置重新初始化对象时未定义的行为
- Visual Studio 中的"指向引用的指针"错误不会按发生位置的文件名显示
- 将指针数组传递给数组,以便在 malloc() 发生的位置发挥作用
- 为什么在递增后使用 [] 运算符访问指针数组会返回错误地址的当前内存位置
- 试图读取AIFF文件意外错误与指针位置等有关
- 使用指针在字符串中获取字符的位置
- qtextstream弄乱了其位置指针
- 我如何知道一个位置指针在二维数组的行数
- 修正:访问冲突读取位置(指针到字符串数组)