劍指Offer之二叉搜索樹的後序遍歷序列

題目描述

  輸入一個整數數組,判斷該數組是否是某二叉搜索樹的後序遍歷的結果。若是是則輸出Yes,不然輸出No。假設輸入的數組的任意兩個數字都互不相同。java

基本思路

  在後序遍歷獲得的序列中,最後一個數字是樹的根節點的值。數組中前面的數字能夠分爲兩部分:第一部分是左子樹節點的值,它們都比根節點的值小;第二部分是右子樹節點的值,他們都比根節點的值大。數組

  以數組{5,7,6,9,10,8}爲例,後序遍歷結果的最後一個數字8就是根節點的值。在這個數組中,前3個數字5,7和6都比8小,是值爲8的節點的左子樹節點;後3個數字9,11和10都比8大,是值爲8的節點的右子樹節點。post

  接下來用一樣的方法肯定與數組每一部分對應的子樹的結構,這實際上是一個遞歸的過程。對於序列5,7,6,最後一個數字6是左子樹的根節點的值。數字5比6小,是值爲6的節點的左子樹,而7則是它的右子節點。一樣,在序列9,11,10中,最後一個數字10是右子樹的根節點,數字9比10小,是值爲10的節點的左子節點,而11則是它的右子節點。spa

  分析另外一個整數數組{7,4,6,5}。後序遍歷的最後一個數字是根節點,所以根節點的值是5。因爲第一個數字7大於5,所以對應的二叉搜索樹中,根節點沒有左子樹,數字7,4和6都是右子樹的節點的值。但右子樹中有一個值爲4的節點,比根節點的值5小,違背了二叉搜索樹的定義。所以不存在一棵二叉搜索樹,它的後序遍歷序列是7,4,6,5。code

Java代碼

package com.swordOffer.sequenceOfBST15; import java.util.Scanner; /** * Created by Feng on 2017/5/14. * 輸入一個整數數組,判斷該數組是否是某二叉搜索樹的後序遍歷的結果。 * 若是是則輸出Yes,不然輸出No。假設輸入的數組的任意兩個數字都互不相同。 */
public class SequenceOfBST { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int n = sc.nextInt();//數組的大小
            int[] postOrder = new int[n]; for (int i = 0; i < n; i++) { postOrder[i] = sc.nextInt(); } boolean result = verifySquenceOfBST(postOrder); if (result) { System.out.println("Yes"); } else { System.out.println("No"); } } } public static boolean verifySquenceOfBST(int[] sequence) { if (sequence.length <= 0) { return false; } return isTreeBST(sequence, 0, sequence.length - 1); } private static boolean isTreeBST(int[] sequence, int start, int end) { //若是至多隻有一個元素
        if (end <= start) { return true; } int i = start; //在二叉樹搜索中左子樹的節點小於根節點
        for (; i < end; i++) { if (sequence[i] > sequence[end]) { break; } } //在二叉樹搜索樹中右子樹的節點大於根節點
        for (int j = i; j < end; j++) { if (sequence[j] < sequence[end]) { return false; } } return isTreeBST(sequence, start, i - 1) && isTreeBST(sequence, i, end - 1); } }
相關文章
相關標籤/搜索