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


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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM