驗證給定序列是不是BST的preoder序列

from leetcode https://leetcode.com/problems/verify-preorder-sequence-in-binary-search-tree/ java

好比序列 2, 1, 3 是以下圖的BST的preorder 序列:code

可是2, 3, 1就不會是一個preorder序列;遞歸

先複習一下BST,給定一個節點,其左子樹的全部節點都小於該節點,右子樹的全部節點都大於該節點;preorder序列是指在遍歷該BST的時候,先記錄根節點,再遍歷左子樹,而後遍歷右子樹;因此一個preorder序列有這樣一個特色,左子樹的序列一定都在右子樹的序列以前;而且左子樹的序列一定都小於根節點,右子樹的序列都大於根節點;leetcode

根據上面的特色很容易經過遞歸的方式完成:get

  1. 若是序列只有一個元素,那麼確定是正確的,對應只有一個節點的樹;class

  2. 若是多於一個元素,以當前節點爲根節點;並從當前節點向後遍歷,直到大於根節點的節點出現(或者到尾巴),那麼根節點以後,該大節點以前的,是左子樹;該大節點及以後的組成右子樹;遞歸判斷左右子樹便可;遍歷

  3. 那麼何時一個序列確定不是一個preorder序列呢?前面獲得的右子樹,若是在其中出現了比根節點還小的數,那麼就能夠直接返回false了;im

代碼以下:img

public boolean verifyPreorder(int[] preorder) {
    return verifyPreorder(preorder, 0, preorder.length);
}

public boolean verifyPreorder(int[] seq, int start, int end) {
    if (start + 1 >= end) {
        return true;
    }

    int root = seq[start];

    int i = start + 1;
    while (i < end && seq[i] < root) {
        i++;
    }

    if (i < end) {
        int j = i;
        while (j < end && seq[j] > root) {
            j++;
        }
        if (j < end) {
            return false;
        }

        return verifyPreorder(seq, start + 1, i) && verifyPreorder(seq, i, end);
    } else {
        return verifyPreorder(seq, start + 1, end);
    }
}
相關文章
相關標籤/搜索