二叉树搜索不返回结果(c++)
Binary Tree search returns no results (C++)
我正在研究一些二叉树算法,需要一个"查找节点与搜索索引…"功能。三极的设计基本上是
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指针是通过值传递的,而不是通过引用传递的。因此,当函数调用完成时,调用方的指针没有接收到值。
你的算法看起来不错:)
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 在更改for循环的第三部分后,未使用for循环结果
- 使用++运算符会导致意外的结果
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- C++Brute Force攻击函数不会返回结果
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 算术运算的结果类似于:C浮点变量中的1/3
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 密码登录程序将永远循环并显示不正确的结果
- 如何让C++'tally up'结果并制定计划?
- 为什么这个程序的结果是3 "born"?和 4 死
- 尝试将字符串/字符转换为整数会产生意外结果