1. 程式人生 > >【劍指Offer】23二叉搜尋樹的後序遍歷序列

【劍指Offer】23二叉搜尋樹的後序遍歷序列

題目描述

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

時間限制:1秒;空間限制:32768K

解題思路

BST後序遍歷的特點是:

大小:L樹 < Root <R樹

排序:L樹 -- R樹 -- Root

因此如果一個序列是合法的BST的後序序列,那麼滿足以下條件:

1、最後一個元素是根節點root

2、root前面的序列可以分為兩段:前一段序列是左子樹,值都小於root值;後一段序列是右子樹,值都大於root值

3、這兩段序列也都是合法的BST的後序序列

可以用遞迴的思路求解本題,Python程式碼:

# -*- coding:utf-8 -*-
class Solution:
    def VerifySquenceOfBST(self, sequence):
        # write code here
        if sequence == None or sequence == []:
            return False
        root = sequence[-1]
        length = len(sequence)
        # 在二叉搜尋樹中左子樹節點小於根節點
        for i in range(length):
            if sequence[i]>root:
                break
        # 二叉搜尋樹中右子樹的節點都大於根節點
        for j in range(i,length-1):
            if sequence[j]<=root:
                return False
        # 判斷左子樹是否為二叉樹
        left = True
        if  i>0:
            left = self.VerifySquenceOfBST(sequence[0:i])
        # 判斷右子樹是否為二叉樹
        right = True
        if i<length-1:
            right = self.VerifySquenceOfBST(sequence[i:-1])
        # 當左右兩子樹都返回True的時候,結果才是True
        return left and right