日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【超100%解法】剑指 Offer 33. 二叉搜索树的后序遍历序列

發布時間:2024/2/28 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【超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. 二叉搜索树的后序遍历序列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。