題目描述:輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。
總結:
一、遞迴方式(好理解)
(1).熟悉後序遍歷原理,後序遍歷陣列最後乙個元素為根節點root;
(2).判斷找出左、右子樹集合的分界下標,然後分別遞迴判斷;
(3).保證右子樹集合中所有數值大於根節點root(因為在(1)中遍歷並未完全遍歷,到右子樹就break了);
(4).分別遞迴左、右子樹集合;當左右子樹都滿足二叉搜尋樹條件時返回true(用&);
class solution
bool fun(vectorvec,int begin,int end)//begin、end是陣列下標0到size()-1;
for(int j=i;jbegin)//保證判斷的元素不重複
left=fun(vec,begin,i-1);//遞迴左子樹集合
bool right=true;
if(i二、非遞迴方式
(1).左子樹一定比右子樹的值小;
(2).從最後乙個元素根節點開始,依次向前比較:
分為left,right兩部分,right部分的最後乙個值是右子樹的根,它也比左子樹所有值大,因此每次只看右子樹是否符合條件即可
(3).每一次往前比較到達左子樹時,左子樹又可以看成由左、右子樹組成的樹,所以還是上述方法處理;
class solution
while(sequence[i] > sequence[size])//遍歷大於根節點的子樹為左子樹集合
if(i < size)//當上乙個while迴圈結束時,i與size關係應該是i=size
return false;//否則說明i少加了一次,即有元素不符合二叉搜尋樹條件
i = 0;//大迴圈完一次,i置0
}return true;
}};
23 二叉搜尋樹的後序遍歷序列
題目描述 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。class solution 思路 已知條件 後序序列最後乙個值為root 二叉搜尋樹左子樹值都比root小,右子樹值都比root大。1 確定root ...
23 二叉搜尋樹的後序遍歷
二叉搜尋樹有其規律,中序遍歷是乙個遞增陣列,因此後續遍歷也有了規律,那就是左子樹一定比根節點小,右子樹一定比根節點大,而後續遍歷最後乙個結點必定是根節點。後續遍歷是左 右 根的順序遍歷,所以按照規則來說,在後續遍歷陣列中,從第乙個大於根節點的數開始,剩下的數都應該大於根結點。如果違背這個規律說明這個...
二叉搜尋樹的後序遍歷序列(第23題)
輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。ac 100 思路 陣列最後乙個數就是二叉樹的根節點。剩下的數可以分為三種情況 1 全小於最後乙個數 根節點的左子樹 2 全大於最後乙個數 根節點的右子樹 3 前...