【超100%解法】剑指 Offer 33. 二叉搜索树的后序遍历序列
立志用最少的代碼做最高效的表達(dá)
輸入一個(gè)整數(shù)數(shù)組,判斷該數(shù)組是不是某二叉搜索樹的后序遍歷結(jié)果。如果是則返回 true,否則返回 false。假設(shè)輸入的數(shù)組的任意兩個(gè)數(shù)字都互不相同。
示例 1:
輸入: [1,6,3,2,5]
輸出: false
示例 2:
輸入: [1,3,2,6,5]
輸出: true
提示:
數(shù)組長度 <= 1000
第一部分:操作:
1、遍歷序列,直到某值大于根節(jié)點(diǎn)值,以此位置為界限分出左子樹和右子樹。
2、遍歷右子樹的值,如果有值小于根節(jié)點(diǎn)值,說明該樹不是BST,返回false。
第二部分:終止條件:
1、當(dāng)左子樹節(jié)點(diǎn)個(gè)數(shù)大于0時(shí),進(jìn)行左子樹的遞歸;反之終止。
2、當(dāng)右子樹節(jié)點(diǎn)個(gè)數(shù)大于0時(shí),進(jìn)行右子樹的遞歸;反之終止。
第三部分:遞歸:
分別遞歸左子樹和右子樹
第四部分:優(yōu)化:
LC中給出的方法參數(shù)帶有數(shù)組,這樣傳參效率很低,因此重新構(gòu)建一個(gè)方法,以位置做參數(shù),同時(shí)將數(shù)組設(shè)置為成員變量,這樣可以大大提高效率。
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) { // 因?yàn)閞的位置是根節(jié)點(diǎn)位置,因此不需遍歷到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);// 當(dāng)左子樹和右子樹都滿足,才返回truereturn (left && right);} }
舉一反三
如果要求處理一棵二叉樹的遍歷序列,則可以先找到該二叉樹的根節(jié)點(diǎn),基于根節(jié)點(diǎn)拆分成左子樹的子序列和右子樹的子序列,接下來再遞歸的處理這兩個(gè)子序列。
總結(jié)
以上是生活随笔為你收集整理的【超100%解法】剑指 Offer 33. 二叉搜索树的后序遍历序列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【最佳解法】剑指 Offer 32 -
- 下一篇: 剑指 Offer 34. 二叉树中和为某