Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 验证二叉树的小问题_C++_Recursion_Binary Tree_Compiler Warnings_Binary Search Tree - Fatal编程技术网

C++ 验证二叉树的小问题

C++ 验证二叉树的小问题,c++,recursion,binary-tree,compiler-warnings,binary-search-tree,C++,Recursion,Binary Tree,Compiler Warnings,Binary Search Tree,我编写了这个递归函数,它按预期工作。它验证二叉树,即检查给定的二叉树是否为二叉搜索树,并给出正确答案 但是,我收到一条编译器警告,上面说: Control may reach end of non-void function 我知道这个错误的意思:函数应该返回bool,而不是在函数的末尾掉下来。我只是不知道如何克服它,因为它确实会返回一个bool 我试图寻找一些我在递归时可能忽略的东西,但没有结果 bool isBSTRecursively(Node * root){ if (!roo

我编写了这个递归函数,它按预期工作。它验证二叉树,即检查给定的二叉树是否为二叉搜索树,并给出正确答案

但是,我收到一条编译器警告,上面说:

Control may reach end of non-void function
我知道这个错误的意思:函数应该返回bool,而不是在函数的末尾掉下来。我只是不知道如何克服它,因为它确实会返回一个bool

我试图寻找一些我在递归时可能忽略的东西,但没有结果

bool isBSTRecursively(Node * root){
    if (!root) {
        return true;
    }else if (!root->getLeft() && !root->getRight()){
        return true;
    }else if(!root->getLeft()){
        if (root->getRight()->getData() > root->getData()) {
            return isBSTRecursively(root->getRight());
        }
    }else if (!root->getRight()){
        if (root->getLeft()->getData() < root->getData()) {
            return isBSTRecursively(root->getLeft());
        }
    }else{
        return (isBSTRecursively(root->getLeft()) && isBSTRecursively(root->getRight()));
    }
}
在这些部分:

}else if(!root->getLeft()){
    if (root->getRight()->getData() > root->getData()) {
        return isBSTRecursively(root->getRight());
    }
}else if (!root->getRight()){
    if (root->getLeft()->getData() < root->getData()) {
        return isBSTRecursively(root->getLeft());
    }
注意,您在这里只返回两种特定情况?这就是警告告诉您的,代码可以采用的路径没有显式包含带值的返回。如果您遇到代码没有显式返回的情况,这可能会导致奇怪的问题

使警告静音的最简单方法是在函数末尾添加一个返回false。

在这些部分:

}else if(!root->getLeft()){
    if (root->getRight()->getData() > root->getData()) {
        return isBSTRecursively(root->getRight());
    }
}else if (!root->getRight()){
    if (root->getLeft()->getData() < root->getData()) {
        return isBSTRecursively(root->getLeft());
    }
注意,您在这里只返回两种特定情况?这就是警告告诉您的,代码可以采用的路径没有显式包含带值的返回。如果您遇到代码没有显式返回的情况,这可能会导致奇怪的问题


使警告静音的最简单方法是在函数末尾添加一个return false。

您编写的函数在所有true选项上都返回true,但没有return false


最后的return false看起来是正确的结果,并且修复了警告。

您编写了一个函数,在所有true选项上都返回true,但没有return false


最后返回false看起来将是正确的结果,并修复警告。

非唯一数据如何?我的意思是,一个节点和它的两个子节点中的任何一个或两个子节点都可能拥有与节点中相同的数据,这不会违反树的分类。你的代码能处理这种情况吗?还有,循环呢,使你的树成为一个图?你也要检查一下吗?@AlexeyFrunze,你说得对。谢谢你引起我的注意。我也将尝试合并这些条件。非唯一数据如何?我的意思是,一个节点和它的两个子节点中的任何一个或两个子节点都可能拥有与节点中相同的数据,这不会违反树的分类。你的代码能处理这种情况吗?还有,循环呢,使你的树成为一个图?你也要检查一下吗?@AlexeyFrunze,你说得对。谢谢你引起我的注意。我也将尝试纳入这些条件。