1. 程式人生 > 實用技巧 >php實現最基礎的session

php實現最基礎的session

劍指 Offer 33. 二叉搜尋樹的後序遍歷序列

地址:劍指 Offer 33. 二叉搜尋樹的後序遍歷序列

輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷結果。如果是則返回 true,否則返回 false。假設輸入的陣列的任意兩個數字都互不相同。

參考以下這顆二叉搜尋樹:

5
/
2 6
/
1 3
示例 1:

輸入: [1,6,3,2,5]
輸出: false
示例 2:

輸入: [1,3,2,6,5]
輸出: true

提示:

陣列長度 <= 1000

//遞迴法 利用二叉搜尋樹處理 左兒子 < 根節點 < 右兒子
//利用節點值與根節點值比較,分隔出左右子樹 對左右子樹進行遞迴
func verifyPostorder(postorder []int) bool {
    return recur(postorder, 0, len(postorder)-1)
}

func recur(postorder []int, left, right int) bool {
    if left >= right {return true}
    cur := left
    for postorder[cur] < postorder[right] {
        cur += 1
    }
    mid := cur
    for postorder[cur] > postorder[right] {
        cur += 1
    }
    return cur == right && recur(postorder, left, mid-1) && recur(postorder, mid, right-1)
}

//利用單調棧,模擬一個沒有右子樹的二叉搜尋樹,不斷去掉訪問到的右子樹更新root節點,直到全部節點出入棧一次
func verifyPostorder(postorder []int) bool {
    root := math.MaxInt32
    stack := make([]int, 0)

    for i := len(postorder)-1; i >= 0; i-- {
        if postorder[i] > root {return false}
        for len(stack) > 0 && postorder[i] < stack[len(stack)-1] {
            root = stack[len(stack)-1]
            stack = stack[0:len(stack)-1]
        }
        stack = append(stack, postorder[i])
    }

    return true
}