1. 程式人生 > 其它 >【劍指offer較難部分9】二叉搜尋樹的後序遍歷序列(java)

【劍指offer較難部分9】二叉搜尋樹的後序遍歷序列(java)

技術標籤:劍指offer(java)資料結構演算法二叉樹java

題目描述

輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則返回true,否則返回false。假設輸入的陣列的任意兩個數字都互不相同。
在這裡插入圖片描述

分析

思路:
1、由後序遍歷的特點可知,最後一個結點即為根節點,設為rootVal
2、根節點會將二叉搜尋樹,分為兩部分,左半部分和右半部分
3、左半部分都小於根節點值,右半部分都大於根節點值
4、得到兩部分後,子樹又可以像上述一樣,確定子樹根節點,然後又分兩部分,如此往復
實現程式碼:

public class Solution {
    public boolean
VerifySquenceOfBST(int [] sequence) { int len = sequence.length; if (sequence == null || len == 0) { return false; } boolean result = verifySquenceOfBST(sequence, 0, len - 1); return result; } private boolean verifySquenceOfBST(int [] sequence,
int begin, int end) { // 一個元素時,為後序遍歷序列,可能只有兩個數,根節點+其他一個數,那麼此時begin傳的值為leftEnd+1,就會比end大 if (begin >= end) { return true; } // root節點的值 int rootVal = sequence[end]; // 序列中的最後一個左子樹節點,一開始是seq[0] int leftEnd = begin; int
i = begin; // 遍歷找到左子樹的序列 與 右子樹序列, 獲取分割索引 while (sequence[i] < rootVal) { leftEnd = i; i++; } // 判斷leftEnd序列後的值,如果存在元素小於rootVal,則不是後序序列 while (i < end) { if (sequence[i] < rootVal) { return false; } i++; } //根節點將樹分成兩部分後,繼續遞迴遍歷左右子樹 return verifySquenceOfBST(sequence, begin, leftEnd) && verifySquenceOfBST(sequence, leftEnd+1, end-1); } }

在這裡插入圖片描述