【问题标题】:Small issue with validating a binary tree验证二叉树的小问题
【发布时间】:2013-03-24 07:28:38
【问题描述】:

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

但是,我收到编译器警告:

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()));
    }
}

【问题讨论】:

  • 非唯一数据呢?我的意思是,一个节点及其两个子节点中的任何一个(或两者)可能具有与节点中相同的数据,并且不会违反树的排序性。你的代码能处理这种情况吗?
  • 另外,循环怎么样,让你的树变成一个图?你也想看看吗?
  • @AlexeyFrunze,你是对的。感谢您引起我的注意。我也会尝试结合这些条件。

标签: c++ recursion binary-tree compiler-warnings binary-search-tree


【解决方案1】:

在这些部分:

}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。如果您遇到代码未明确执行此操作的情况,这可能会导致奇怪的问题return

消除警告的最简单方法是在函数末尾添加return false

【讨论】:

    【解决方案2】:

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

    看起来最后 return false 将是正确的结果以及修复警告。

    【讨论】:

      猜你喜欢
      • 2020-12-31
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 2021-07-30
      • 2018-09-29
      • 2013-01-24
      • 1970-01-01
      • 2012-08-18
      相关资源
      最近更新 更多