二叉树搜索不返回结果(c++)

Binary Tree search returns no results (C++)

本文关键字:c++ 结果 返回 搜索 二叉树      更新时间:2023-10-16

我正在研究一些二叉树算法,需要一个"查找节点与搜索索引…"功能。三极的设计基本上是

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是指向树中找到(或未找到)节点的指针。

函数不返回指向找到的节点的引用或指针,但修改指针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,即使该树包含具有搜索索引的节点。我非常仔细地一步一步调试它,它检测到

(root->index == nodeIndex)

正确但

  resultNode = root; 

不工作(我希望resultNode指向相同的地址指向)。调试器说resultNode分配前是0x0, 节点是某个地址,分配后resultNode仍然是0x0。

我必须重载操作符=在这种情况下,类TreeNode?

我试过了:

TreeNode & TreeNode::operator=(const TreeNode & oldTreeNode){
 *this = oldTreeNode;
 return *this;
 // ignore childs for now
}

我不是专家,但这个运算符=似乎微不足道。它会影响两个TreeNode指针*node1 = *node2的分配吗?

也许你能帮助我。谢谢你的阅读,谢谢你的帮助。如果我自己找到了解决办法,我会贴在这里的。

问候,div标记

由于您通过值将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
}
当调用函数Bar时,resultNode的值与NULL相同,x的值与0相同。要解决此问题,可以将指针作为指针传递给指针,或者作为引用指针传入:
void Tree::searchNode(TreeNode* root, int nodeIndex, TreeNode*& resultNode)
{
    // same code
}

…或:

void Tree::searchNode(TreeNode* root, int nodeIndex, TreeNode** resultNodePtr)
{
    // assign to *resultNodePtr instead
}

您的resultNode指针是通过值传递的,而不是通过引用传递的。因此,当函数调用完成时,调用方的指针没有接收到值。

你的算法看起来不错:)