1. 程式人生 > >劍指offer 二叉搜索樹的後序遍歷序列

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

簡單 利用 elf ews 個數字 als off 不能 一個

劍指offer 牛客網 二叉搜索樹的後序遍歷序列

# -*- coding: utf-8 -*-
"""
Created on Tue Apr  9 10:12:31 2019

@author: Administrator
題目:
輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。
如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。
思路:
BST的中序遍歷是有序的,後序(左友根)遍歷時,最後的節點是根節點。
那麽可以先找根節點,然後利用根節點的值,把數組分成兩部分,前部分都比根節點小是左子樹,
後部分都比根節點大是右子樹。然後再分別遍歷左右子樹即可。
做這個題的時候利用從左遍歷找到第一個比根節點的大的位置劃分左右節點,
這樣保證了左邊部分都比根節點小,不能保證右邊部分都比根節點大,所以對右邊的部分進行了驗證。
另外題目中有個坑,題目認為,空樹不是BST……所以新定義了函數進行遞歸,否則會更簡單點。
""" # -*- coding:utf-8 -*- class Solution: def VerifySquenceOfBST(self, sequence): # write code here if not sequence: #若數組為空,則直接返回 return False return self.VerifyBST(sequence) def VerifyBST(self,sequence): if not sequence: #當只分割為空的時候,說明全部符合,返回為真
return True root = sequence.pop() #最後一個節點就是根節點 index = self.FindIndex(sequence,root) #找到大於根節點的那個位置就是右節點的區域位置 if self.VerifyRight(sequence[index:],root): left = sequence[:index] #遞歸分左邊區域 right = sequence[index:] #遞歸分為右邊區域 return
self.VerifyBST(left) and self.VerifyBST(right) #and只有全部左右都符合才返回真 return False def VerifyRight(self,sequence,target): if not sequence: return True return min(sequence) > target def FindIndex(self,sequence,target): for i ,num in enumerate(sequence): if num > target: return i return len(sequence) if __name__ == __main__: solution = Solution() sequence = [4,8,6,12,16,14,10] res = solution.VerifySquenceOfBST(sequence) print(res)

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