【LeetCode-樹】二叉搜尋樹的後序遍歷序列
阿新 • • 發佈:2020-08-05
題目描述
輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷結果。如果是則返回 true,否則返回 false。假設輸入的陣列的任意兩個數字都互不相同。
示例:
輸入: [1,6,3,2,5]
輸出: false
輸入: [1,3,2,6,5]
輸出: true
說明:
- 陣列長度 <= 1000
題目連結: https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof/
思路
二叉搜尋樹的後序遍歷序列的最後一個節點是根節點,除去最後一個節點,序列可以分為兩個連續的部分:一部分小於根節點的值(左子樹),另一部分大於根節點的值(右子樹)。所以,我們根據根節點判斷第一段序列是不是全都小於根節點的值,第二段序列是不是全都大於根節點的值。如果是的話,遞迴判斷兩段序列;否則,返回 false。
程式碼如下:
class Solution { public: bool verifyPostorder(vector<int>& postorder) { return doVerify(postorder, 0, postorder.size()-1); } bool doVerify(vector<int>& postorder, int left, int right){ if(left>=right) return true; int i = left; while(postorder[i]<postorder[right]) i++; i--; // 別忘了 i-- int j = i+1; while(postorder[j]>postorder[right]) j++; if(j!=right) return false; return doVerify(postorder, left, i) && doVerify(postorder, i+1, right-1); } };