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

고유하지 않은 데이터는 어떻습니까? 즉, 노드와 그 두 자식 중 하나 (또는 ​​둘 모두)가 노드와 동일한 데이터를 가질 수 있으며 트리의 정렬을 위반하지 않을 것입니다. 귀하의 코드가이 사건을 처리합니까? –

+1

또한, 당신의 나무를 그래프로 만드는 것은 어떨까요? 그걸 확인하고 싶니? –

+0

@AlexeyFrunze, 당신 말이 맞아요. 제 관심을 가져 주셔서 감사합니다. 나는 그러한 조건들을 통합하려고 노력할 것이다. – totjammykd

답변

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

2

모든 true 옵션에서 true를 반환하는 함수를 작성했지만 반환 false는 없습니다.

마지막에 false를 반환하는 것처럼 보이는 것은 정확한 결과 일뿐만 아니라 경고를 수정합니다.