php實現最基礎的session
阿新 • • 發佈:2021-01-07
劍指 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 }