首先定義一個二叉樹的結構體
struct BinaryTree { int value; BinaryTree* lson; BinaryTree* rson; };
- 第一種方法
int maxOf(BinaryTree* root) { if (root->rson) { return maxOf(root->rson); } return root->value; } int minOf(BinaryTree* root) { if (root->lson) { return maxOf(root->lson); } return root->value; } bool check(BinaryTree* root) { if (root == NULL) { return true; } // 如果左子樹的最大值小於當前節點值並且右子樹的最小值大於當前節點的值並且左右子樹都是二叉搜索樹,則返回true,否則返回false; if (root->lson != NULL && maxOf(root->lson) >= root->value) { return false; } if (root->rson != NULL && minOf(root->rson) <= root->value) { return false; } return check(root->lson) && check(root->rson); }
這里有一個誤區:
// 錯誤代碼 bool check(BinaryTree* root) { if (root == NULL) { return true; } if (root->lson != NULL && root->lson->value >= root->value) { return false; } if (root->rson != NULL && root->rson->value <= root->value) { return false; } return check(root->lson) && check(root->rson); }
反正我一開始是這樣想的,所以注意一下上面這種錯誤寫法。
- 第二種方法
int max = -2147483648; bool check(BinaryTree* root) { if (root == NULL) { return true; } if (!check(root->lson)) { return false; } if (max >= root->value) { return false; } return check(root->rson); }
這個代碼就是一個中序遍歷,如果value遞增,說明是一顆二叉搜索樹,否則不是。當然max的初始值設置為-2147483648之后二叉樹中就不能出現-2147483648,否則會出錯。也可以把max類型改成long long之后用更小的數。