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

2021-09-21 14:21:39 字數 1190 閱讀 5150

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

那麼怎麼判斷乙個序列是不是二叉搜尋樹的後序遍歷序列呢?

首先要考慮到二叉搜尋樹的性質,就是任意節點的左子樹的元素都小於這個節點,右子樹的元素都大於這個節點。那麼我們可以從這個性質著手來解決問題。

乙個序列,最後乙個數字一定是作為根節點,然後前一部分一定為左子樹,後一部分一定為右子樹,也就是說, 2 1 4 5 3這個序列在這個節點是可以的,這個節點為3,左子樹為2 1,右子樹為4 5,而 3 1 2則是不可以的,因為3是大於2的,所以3 1按道理都是2的右子樹,這個時候1是小於2的,不滿足二叉搜尋樹的性質,所以在這個節點上不滿足二叉搜尋樹的性質。

知道上述的思路之後,後面就簡單了,就是不斷的遞迴,最後返回結果,首先檢查根節點是不是滿足性質,然後檢查根節點的左右子樹是否滿足性質,一直檢查到最後檢查了整個樹的每乙個節點,如果都滿足性質則返回true,否則返回false。

具體**如下:

class solution 

; vector<

int> right

;for

(int i =

0; i < sequence.

size()

-1; i++)if

(flag && sequence[i]

< sequence.

back()

)return false;

if(flag == false) left.

push_back

(sequence[i]);

if(flag == true) right.

push_back

(sequence[i]);

}if(left.

empty()

)return

verifysquenceofbst

(right);if

(right.

empty()

)return

verifysquenceofbst

(left)

;return

verifysquenceofbst

(right)

&&verifysquenceofbst

(left);}

};

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

輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。class solution private bool verifycore vector vec,int start,int end 檢查右子樹是否符合二叉搜尋...

牛客網劍指offer 二叉搜尋樹與雙向鍊錶

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。struct treenode class solution private dfs,用兩個指標的引用來返回子樹連線後的頭和尾,然後左子樹的尾和右子樹的頭與根節點連線,再將左子樹的頭和右...

牛客《劍指Offer》 重建二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。二叉樹原本可以用遞迴的方式定義,所以面對此類問題注意向遞迴的思想靠攏。將整棵樹的構造過程視為對其左右子樹的構造過程,關鍵如何劃分子樹...