有兩種方法可以做到這一點。
一種是自上而下的方法,首先檢查當前節點是否有效,如果是,則檢查兩個子樹。這非常直觀。你可以從@lerman's post找到代碼:
struct TreeNode {
int data;
TreeNode *left;
TreeNode *right;
};
bool isBST(TreeNode *node, int minData, int maxData) {
if(node == NULL) return true;
if(node->data < minData || node->data > maxData) return false;
return isBST(node->left, minData, node->data) && isBST(node->right, node->data, maxData);
}
if(isBST(root, INT_MIN, INT_MAX)) {
puts("This is a BST.");
} else {
puts("This is NOT a BST!");
}
另一種方式是自下而上的方法:先檢查左substree然後右鍵substree,最後檢查當前的樹。下面是這種方法的代碼。
bool isValidBST(TreeNode *root) {
int mmin, mmax;
return helper(root, mmin, mmax);
}
bool helper(TreeNode* root, int& mmin, int& mmax) {
if(!root) {
mmin = INT_MAX;
mmax = INT_MIN;
return true;
}
int leftmin, leftmax, rightmin, rightmax;
if(!helper(root->left, leftmin, leftmax))
return false;
if(!helper(root->right, rightmin, rightmax))
return false;
if(root->val > leftmax && root->val < rightmin) {
mmin = min(min(leftmin, rightmin), root->val);
mmax = max(max(leftmax, rightmax), root->val);
return true;
}
else
return false;
}
您可能會注意到第一種方法是預序遍歷,第二種方法是後序遍歷。在這裏不恰當的遍歷,因爲它與BST的定義相沖突。
可能root爲空。你有沒有嘗試在調試器中運行你的代碼? –
移動'isNull(root);'在第一個'之前'if(root-> data ...)...;'。在訪問其數據之前,您需要檢查它是否爲NULL。 – Jeribo
@Jeribo嘗試這樣做。沒有好的 – WitchKingofAngmar