C++ 在二叉树中查找元素
如何在二叉树中搜索不是bst的元素 这是我的树的外观示例C++ 在二叉树中查找元素,c++,data-structures,binary-tree,C++,Data Structures,Binary Tree,如何在二叉树中搜索不是bst的元素 这是我的树的外观示例 1 / \ 2 3 / \ / \ 4 5 6 7 这就是我正在做的: treeNode * find(treeNode *T, int x) { if(T == NULL) return NULL; if(x == T -> element) { return T; } find(T -> left, x); find(
1
/ \
2 3
/ \ / \
4 5 6 7
这就是我正在做的:
treeNode * find(treeNode *T, int x) {
if(T == NULL) return NULL;
if(x == T -> element) {
return T;
}
find(T -> left, x);
find(T -> right, x);
return NULL;
}
问题是当满足if时,递归不会停止,因为递归调用缺少return语句。因此,不仅递归会继续,而且值永远不会返回给原始调用方
treeNode * find(treeNode *T, int x) {
if(T == NULL) return NULL;
if(x == T -> element) {
return T;
}
auto findLeft = find(T -> left, x)
if (findLeft) return findLeft;
return find(T -> right, x);
}
您忽略了递归调用的返回值:
treeNode * find(treeNode *T, int x) {
if(T == NULL) return NULL;
if(x == T -> element) {
return T;
}
treeNode *result = find(T -> left, x);
if ( result ) // if the return value was found, this will not be NULL, so return the node
return result;
return find(T -> right, x); // will return NULL if its not found
}
上下文-
问题是当满足if时,递归不会停止
-原因是您必须检查递归调用是否返回有效结果,并停止进一步搜索
改变-
find(T -> left, x);
find(T -> right, x);
-差不多-
treeNode* result = find(T -> left, x);
if (result != NULL)
return result;
return find(T -> right, x);
查看每次尝试查找
x
treeNode * find(treeNode *T, int x) {
if(T == NULL) return NULL;
if(x == T -> element) {
return T;
}
treeNode* result = find(T -> left, x);
if (result)
return result;
result = find(T -> right, x);
if (result)
return result;
return NULL;
}
预计到达时间:这一过程的结束可以简化。返回结果
如果它不是NULL
则返回NULL
否则。。。与返回结果
相同。实际上,我们所做的只是返回调用find
返回的值。所以
treeNode * find(treeNode *T, int x) {
if(T == NULL) return NULL;
if(x == T -> element) {
return T;
}
treeNode* result = find(T -> left, x);
if (result)
return result;
return find(T -> right, x);
}
二叉树通常用于保持数据排序,并按该顺序快速添加/查找项 没有顺序的二叉树没有太多的应用。所以当我看到你们的树的图片时,我怀疑你们错过了b-树最重要的属性,可能是你们任务的重要部分 如果您注意到顺序在任务中很重要,请查看该代码:
类节点;
使用NodePtr=std::uniqeu_ptr;
类节点
{
int值;
诺德普左;
无接受权;
};
无效插入(NodePtr和node,int值)
{
如果(节点){
插入((值<节点->值)?节点->左:节点->右,值);
}否则{
重置(新节点{value});
}
}
节点*查找(节点*节点,int值)
{
如果(!节点){
返回空ptr;
}
如果(节点->值==值){
返回node.get();
}
返回find((valuevalue)?node->left.get():node->right.get(),value);
}
您是否尝试过检查每个节点以确定它是否是您要查找的元素?如果是,您对该解决方案有什么问题?如果不是,那就试试吧。任何一本像样的算法教科书都应该包括深度优先搜索。似乎您为呼吸优先搜索设置了示例,该搜索比DFS更难实现。当您递归调用find
时,您应该对返回值进行处理。这就是你检测成功搜索的方法,不是吗?你的错误是你从来没有检查递归函数返回的是什么。好吧,这是递归最容易混淆的地方。我觉得它很有趣,因为只有在递归中,初学者才希望返回值能够神奇地向调用堆栈上移动。暂时忘掉递归,考虑到第一个调用只能返回<代码> null <代码>,除非它已经是搜索元素。啊,我不熟悉CPP,假设它将返回哪个PTR为truth.谢谢你指出这一点。