劍指Offer刷題筆記 二叉搜尋樹的後序遍歷序列

2021-09-26 01:45:50 字數 1533 閱讀 8628

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

首先確定二叉搜尋樹的定義:

二叉查詢樹(binary search tree),它或者是一棵空樹,或者是具有下列性質的二叉樹:

1.若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;

2.若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;

3.它的左、右子樹也分別為二叉排序樹。

換句話說,在沒有結點,只要它有子結點,就是左結點的值小於根結點的值大於右結點的值。

根據二叉搜尋樹的數值排序特點,中序遍歷(根左右)遍歷二叉搜尋樹會得到有序的序列。

思路:首先後序遍歷的特徵就是序列的結尾總是根結點,根據二叉搜尋樹的特徵,對於乙個根結點它的左子樹小於它,它的右子樹大於它。也就是說從序列中彈出根結點之後,剩下的就是它的左右子樹的全部結點,如果它是二叉搜尋樹,把根結點就能插入進去,左面都是比它大的,右面都是比它小的。

# -*- coding:utf-8 -*-

class solution:

def verifysquenceofbst(self, sequence):

# write code here

# 只有第一次根結點為空是false

# 所以判斷子樹的時候,要保證sequence不是空

if not sequence:

return false

if len(sequence) == 1:

return true

i=0length = len(sequence)

# 找出左子樹

while sequence[i] < sequence[-1]:

i+=1

# 找出左子樹之後,理應剩下的都是右子樹,也就是都比根結點大的。

# 所以在剩下的結點裡如果出現小於的就不是平衡二叉樹

for j in range(i,len(sequence)-1):

if sequence[j] < sequence[-1]:

return false

# 如果滿足條件,就把左右子樹切分出來

left_s = sequence[:i]

right_s = sequence[i:length-1]

# 這塊是不能直接返回self.verifysquenceofbst()左右子樹的返回結果的與

# 因為對於第一次根結點為空,那空樹就不是搜尋樹

# 對於子樹是空樹,判斷應該是為真,所以這裡需要判斷子樹序列是不是空

# 並且用標誌變數,儲存結果

left, right = true, true

if len(left_s) > 0:

left = self.verifysquenceofbst(left_s)

if len(right_s) > 0:

right = self.verifysquenceofbst(right_s)

return left and right

劍指Offer 刷題 重建二叉樹

definition for binary tree public class treenode public class solution int val pre prel 前序遍歷序列中的第乙個數即為根節點 treenode tree newtreenode val int mid 0 找到根節...

劍指Offer刷題筆記 二叉樹的映象

操作給定的二叉樹,將其變換為源二叉樹的映象。思路 遞迴的交換左右子樹。不是交換結點的數值,直接交換結點。coding utf 8 class treenode def init self,x self.val x self.left none self.right none class soluti...

劍指Offer刷題筆記 二叉樹的深度

輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點 含根 葉結點 形成樹的一條路徑,最長路徑的長度為樹的深度。就是深度搜尋,找到最大深度。coding utf 8 class treenode def init self,x self.val x self.left none self.r...