【超100%解法】剑指 Offer 33. 二叉搜索树的后序遍历序列
生活随笔
收集整理的這篇文章主要介紹了
【超100%解法】剑指 Offer 33. 二叉搜索树的后序遍历序列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
立志用最少的代碼做最高效的表達
輸入一個整數數組,判斷該數組是不是某二叉搜索樹的后序遍歷結果。如果是則返回 true,否則返回 false。假設輸入的數組的任意兩個數字都互不相同。
示例 1:
輸入: [1,6,3,2,5]
輸出: false
示例 2:
輸入: [1,3,2,6,5]
輸出: true
提示:
數組長度 <= 1000
第一部分:操作:
1、遍歷序列,直到某值大于根節點值,以此位置為界限分出左子樹和右子樹。
2、遍歷右子樹的值,如果有值小于根節點值,說明該樹不是BST,返回false。
第二部分:終止條件:
1、當左子樹節點個數大于0時,進行左子樹的遞歸;反之終止。
2、當右子樹節點個數大于0時,進行右子樹的遞歸;反之終止。
第三部分:遞歸:
分別遞歸左子樹和右子樹
第四部分:優化:
LC中給出的方法參數帶有數組,這樣傳參效率很低,因此重新構建一個方法,以位置做參數,同時將數組設置為成員變量,這樣可以大大提高效率。
class Solution {int[] postOrder;public boolean verifyPostorder(int[] postorder) {if(postorder.length == 0) return true;postOrder = postorder;return verifyPostOrder(0, postOrder.length-1);}public boolean verifyPostOrder(int l, int r) {int rootValue = postOrder[r];int i; // 根的值for(i = l; i < r; ++i) { // 因為r的位置是根節點位置,因此不需遍歷到rif(postOrder[i] > rootValue) break;}int j;for(j = i; j < r; ++j) {if(postOrder[j] < rootValue) return false;}// 判斷左子樹是否為二叉搜索樹boolean left = true;if(i-l > 0) left = verifyPostOrder(l, i-1);// 判斷右子樹是否為二叉搜索樹boolean right = true;if(j-i > 0) right = verifyPostOrder(i, j-1);// 當左子樹和右子樹都滿足,才返回truereturn (left && right);} }
舉一反三
如果要求處理一棵二叉樹的遍歷序列,則可以先找到該二叉樹的根節點,基于根節點拆分成左子樹的子序列和右子樹的子序列,接下來再遞歸的處理這兩個子序列。
總結
以上是生活随笔為你收集整理的【超100%解法】剑指 Offer 33. 二叉搜索树的后序遍历序列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【最佳解法】剑指 Offer 32 -
- 下一篇: 剑指 Offer 34. 二叉树中和为某