輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。
1. 二叉搜尋樹:左子樹永遠比右子樹小
2. 後序遍歷:最後訪問根節點
由上述兩點可知:後序遍歷序列的最後是根節點,可以將前面的部分分為比它小的左子樹和比它大的右子樹。
1、遞迴:
這道題很顯然我們可以用遞迴的方法來做:只要我們判斷當前序列的最後節點,可以將前面序列可以完全分解為左子樹序列和右子樹序列,並且這兩個序列也滿足這樣的條件,那個這個序列就是正確的。
1)找到序列的最後乙個元素a
2)判斷a能否將序列完全分解成左子樹序列和右子樹序列
i = 0;
while(seq[i]while(seq[i]>a)壓入右子樹;i++;
if(左子樹+右子樹=序列的長度 && 左子樹滿足條件 && 右子樹滿足條件)return true;
return false;
**:
這裡我採用的方法是用兩個vector陣列來儲存左子樹和右子樹,大家也可以採用記錄左右子樹開始和結束的索引的方法,將這兩個索引值作為函式引數傳入,這樣可以節省儲存空間。
class solution
bool issquenceofbst(vectorsequence)
if(left.size()+right.size() == sequence.size()-1)
if(issquenceofbst(left) && issquenceofbst(right))
return true;
return false;
}};
2、非遞迴:
非遞迴其實也使用了類似的思想。
每個序列的最後乙個值一定是可以把前面的序列劃分為左右子樹的。
class solution
while(sequence[size]if(i!=size)return false;
}return true;
} };
劍指offer 二叉樹 二叉樹搜尋樹
package bst import j a.util.public class bst if pre.length 0 in.length 0 treenode root new treenode pre 0 for int i 0 i in.length i return root 判斷給定陣列...
劍指offer 程式設計題 二叉搜尋樹的後序遍歷序列
輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。思路 class solution public bool verifysquenceofbst vectora 非遞迴 非遞迴也是乙個基於遞迴的思想 左子樹一定...
劍指Offer 二叉搜尋樹的後序遍歷
輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。author zy date 2017年10月13日 下午9 34 21 decription 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如...