1

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

不过,我得到一个编译器警告说:

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

非唯一数据如何?我的意思是,一个节点及其两个子节点(或两者)中的任何一个可能具有与节点中相同的数据,并且不会违反树的分类。你的代码是否处理这种情况? – 2013-03-24 07:55:49

+1

另外,怎么样循环,让你的树形图?你也想检查一下吗? – 2013-03-24 07:56:41

+0

@AlexeyFrunze,你是对的。感谢您引起我的注意。我也会尝试纳入这些条件。 – totjammykd 2013-03-24 08:11:46

回答

2

在这些部分:

}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

+0

谢谢你的明确解释。现在它工作正常。 – totjammykd 2013-03-24 07:35:58

2

你写了一个函数,在所有真正的选项上返回true,但没有返回false。

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