輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。其實這個題目的思路並不難,只要知道後續遍歷的思維以及二叉搜尋樹的特性即可輕鬆破解。由於是後序遍歷,一般來說陣列中的最後一位為根節點,而根節點的左子樹部分則位於後序遍歷序列的前半段,而在根節點與左子樹中間的部分即為二叉搜尋樹的右子樹。
[9, 16, 10, 20, 32, 24, 18]
即為乙個常規的二叉搜尋樹的後序遍歷序列,但是同時我們也需要考慮到一些特殊的後序遍歷序列,例如[5, 4, 3, 2, 1]
,[6, 8, 12, 17, 23]
這類序列也屬於二叉搜尋樹的後序遍歷序列,一般這種都是只有一顆左子樹或者只有一顆右子樹的二叉搜尋樹。
對於上述的兩類特殊的後序遍歷序列可以較為直觀的進行判斷,而對於常規的二叉搜尋樹的後序遍歷序列,則需要進行進一步的操作。例如序列[9, 16, 10, 20, 32, 24, 18]
,可以將其左右子樹的序列分割出來,左子樹[9, 16, 10]
,右子樹[20 32 24]
,然後進行遞迴,而遞迴的結束條件為:
輸入的序列類似於[5, 4, 3, 2, 1]
或[6, 8, 12, 17, 23]
這種單調序列時,返回true
;
如果由輸入序列分割獲得的右子樹序列中包含小於根節點的值的元素,則返回false
。
# -*- coding:utf-8 -*-
class
solution
:def
verifysquenceofbst
(self, sequence)
:# write code here
ifnot sequence:
return
false
# 如果輸入序列為單調序列,則返回true
if sequence ==
sorted
(sequence)
or sequence ==
list
(reversed
(sorted
(sequence)))
:return
true
left =
# 用於存放左子樹序列
right =
# 用於存放右子樹序列
for i in
range
(len
(sequence)):
if sequence[i]
> sequence[-1
]:# 獲得左右子樹序列
left += sequence[
:i] right += sequence[i:-1
]break
# 一旦獲得了左右子樹序列便跳出迴圈
flag =
true
for j in right:
# 對右子樹中的元素進行遍歷,如果有小於根節點的元素即判斷當前輸入序列不滿足條件
if j < sequence[-1
]:flag =
false
if flag:
return self.verifysquenceofbst(left)
and self.verifysquenceofbst(right)
else
:return
false
劍指Offer 二叉搜尋樹的後序遍歷
輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。author zy date 2017年10月13日 下午9 34 21 decription 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如...
劍指offer 二叉搜尋樹的後序遍歷
時間限制 1秒 空間限制 32768k 熱度指數 524747 本題知識點 棧 樹輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。這兩天狀態不行,沒多大刷題的動力。菜還不想動,說的大概就是我了。遞迴 大佬的思路...
劍指offer 二叉搜尋樹的後序遍歷
題目描述 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。簡單思路 二叉搜尋樹 1.左孩子 根 右孩子 2.bst的左孩子和右孩子都是bst 發現對於每一棵子樹,它的根結點總是對應該子樹的後序序列的最後乙個數 ...