二叉树搜索没有返回结果(C ++)

时间:2011-08-26 17:40:27

标签: c++ search binary-tree

我正在研究一些二叉树算法,需要一个“使用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的赋值?

也许你可以帮助我。感谢您的阅读,感谢您的帮助。 如果我自己找到解决方案,我会在这里发布。

此致 标记

2 个答案:

答案 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更改,原因与x0函数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指针是按值传递的,而不是通过引用传递的。因此,当函数调用完成时,调用端的指针不会收到值。

您的算法看起来很好:)