我正在研究一些二叉树算法,需要一个“使用searchindex ...查找节点”功能。 treenodes的设计基本上是
class TreeNode {
int index; // some identifier
TreeNode *left;
TreeNode *right;
}
并且树由指向根节点的指针定义。
我对搜索功能的实现是:
void Tree::searchNode(TreeNode * root, int nodeIndex, TreeNode *resultNode){
/* Recursive search */
if (root->index == nodeIndex) {
resultNode = root;
} else {
/* search children if the current node is not a leaf */
if(!root->isLeaf()) {
this->searchNode(root->left,nodeIndex,resultNode);
this->searchNode(root->right,nodeIndex,resultNode);
}
}
}
参数: * root 是树的根节点, nodeIndex 是搜索索引和* resultNode < / em>是指向树中找到(或不是)节点的指针。
该函数不会返回指向找到的节点的引用或指针,但会修改指针 resultNode ,使其指向找到的节点。我们的想法是使用NULL初始化resultNode,执行搜索并在匹配发生时修改它。否则它仍然是NULL,我可以很容易地检查是否有搜索结果。
另一个以树 buildingTree 为成员的类以这种方式使用搜索功能:
TreeNode *resultNodePtr = NULL;
this->buildingTree->searchNode(this->buildingTree->rootPtr,
currentNodeIndex, resultNodePtr);
// do sth. with resultNodePtr if != NULL
我在堆栈上创建了* resultNodePtr ,因为我只是在函数内部暂时需要它。这样做是否正确?但是:该功能不起作用。 resultNodePtr 始终为NULL,即使树包含具有search-index的节点也是如此。我一步一步地仔细调试它,它检测到
(root->index == nodeIndex)
正确但
resultNode = root;
不起作用(我希望 resultNode 指向相同的地址 root 指向)。 在赋值为0x0之前,调试器说 resultNode , root 节点是某个地址,在赋值 resultNode 之后仍为0x0。
我是否必须重载operator =在这种情况下是否为TreeNode类?
我试过了:
TreeNode & TreeNode::operator=(const TreeNode & oldTreeNode){
*this = oldTreeNode;
return *this;
// ignore childs for now
}
我不是专家,但这个算子=似乎微不足道。它是否会影响两个TreeNode指针* node1 = * node2的赋值?
也许你可以帮助我。感谢您的阅读,感谢您的帮助。 如果我自己找到解决方案,我会在这里发布。
此致 标记
答案 0 :(得分:2)
因为您通过值将resultNode
作为指针传递给函数,所以它的原始值永远不会改变。将TreeNode*
视为字面上只不过是代表内存地址的数字;当你重新分配时:
resultNode = root;
这会修改searchNode
所拥有的副本,但不会修改调用searchNode
的代码中的原始指针。举个简单的例子:
void Foo(int x)
{
x = 100;
}
void Bar()
{
int x = 0;
Foo(x);
// at this point, x is still 0
}
resultNode
的值不会从NULL
更改,原因与x
在0
函数Bar
不变时相同调用。要解决此问题,请将指针作为指针传递给指针,或者通过引用传递指针:
void Tree::searchNode(TreeNode* root, int nodeIndex, TreeNode*& resultNode)
{
// same code
}
......或:
void Tree::searchNode(TreeNode* root, int nodeIndex, TreeNode** resultNodePtr)
{
// assign to *resultNodePtr instead
}
答案 1 :(得分:0)
您的resultNode指针是按值传递的,而不是通过引用传递的。因此,当函数调用完成时,调用端的指针不会收到值。
您的算法看起来很好:)