C++ 在二叉树中查找元素

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(

如何在二叉树中搜索不是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(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.谢谢你指出这一点。