1. 程式人生 > >判斷一顆二叉樹是否為二叉搜尋樹

判斷一顆二叉樹是否為二叉搜尋樹

首先定義一個二叉樹的結構體

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之後用更小的數。