LeetCode Algorithms 98. Validate Binary Search Tree 題解

題目:判斷一棵樹是否爲BST樹
因爲BST廣爲人知,所以就不搬原文了,其中節點的數值是int類型。

對於BST樹,對它做中序遍歷即可輸出排好序的一串數字,那麼對於這個題目就有兩個思路:
1. 對這棵樹做一次中序遍歷,輸出一個數組,然後判斷數組是否有序
2. 同樣是做中序遍歷,但只比較當前節點的數值與前一個節點的數值大小

對於第一種思路,很好實現,先做一次中序遍歷,中序遍歷有遞歸與非遞歸的實現,遞歸實現比較直觀,所以在這裏只說說非遞歸的實現。

使用棧來保存接下來要訪問的節點,先訪問完左子樹,即root->left == NULL了,就取棧頂保存的該節點的父親,然後訪問其值,再訪問右子樹root = root->right

對於第二種思路,需要保存上一個訪問的節點的值,判斷當前節點的值與上一個節點的值是否符合BST規則。在中序遍歷的訪問節點階段做個判斷即可。

以下是第二種思路的代碼:

bool isValidBST(TreeNode* root) {
    if (root == NULL) return true;
    signed long long int prv = LLONG_MIN;
    TreeNode* _root = root;
    stack<TreeNode*> sequence;
    while (_root != NULL || !sequence.empty()) {
        if (_root != NULL) {
            sequence.push(_root);
            _root = _root->left;
        }
        else {
            _root = sequence.top();
            //訪問
            if (_root->val <= prv) {
                return false;
            }
            sequence.pop();
            prv = _root->val;
            _root = _root->right;
        }
    }
    return true;
}

代碼使用了一個LLONG_MIN的值初始化prv,但這不是好的邊界處理,因爲題目稍作修改這個初始化的值又要換一個更小的值。解決這個問題可以在遍歷訪問到最左的節點時(即最小的節點)使用那個值初始化prv

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章