輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。假設輸入的陣列的任意兩個數字都互不相同。
二叉搜尋樹或者是一棵空樹,或者是具有下列性質的二叉樹:
(1)若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
(2)若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
(3)左、右子樹也分別為二叉排序樹;
(4)沒有鍵值相等的節點
採用分治法的思想,找到根結點、左子樹的序列、右子樹的序列,分別判斷左右子串行是否為二叉樹的後序序列。
由題意可得:
1. 後序遍歷序列的最後乙個元素為二叉樹的根節點;
2. 二叉搜尋樹左子樹上所有的結點均小於根結點、右子樹所有的結點均大於根結點。
演算法步驟如下:
1. 找到根結點;
2. 遍歷序列,找到第乙個大於等於根結點的元素i,則i左側為左子樹、i右側為右子樹;
3. 我們已經知道i左側所有元素均小於根結點,那麼再依次遍歷右側,看是否所有元素均大於根結點;若出現小於根結點的元素,則直接返回false;若右側全都大於根結點,則:
4. 分別遞迴判斷左/右子串行是否為後序序列;
其中在判斷start<=end的時候是都需要判斷
1️⃣取到start==end時說明剩下的元素為1個,肯定是符合後序遍歷,就直接返回true
2️⃣須判斷start>end的情況,這種情況是沒有左子樹,只有根節點和乙個右節點(只有兩個元素)的情況,此時再遞迴左子樹的時候,此時傳入的end=start-1,此時的因為之前已經判斷了右子樹符合條件,此時就直接返回true
public class solution
//當為只有乙個元素的時候直接返回true
//if(sequence.length==1)
return verifysquenceofbst(sequence,0,sequence.length-1);
}public boolean verifysquenceofbst(int sequence,int start,int end )
//取到end處的元素,該元素為根節點
int root= sequence[end];
int i=0;
//從左向右開始找到第乙個比根節點的元素大的位置i,在i的左邊即為根節點的左子樹(因為題目中給成輸入陣列互不相同)
牛客網 二叉搜尋樹的後序遍歷序列
輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。public class solution else if sequence.length 1 return verifysequenceofbst sequen...
牛客網 24 二叉搜尋樹的後序遍歷序列
輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同 package leetcode public class l23sequenceofbst private boolean verifysquenceofbst...
二叉搜尋樹的後序遍歷序列
題目 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是返回true,否則返回false。假設輸入的陣列的任意兩個數字都不相同。解答 二叉搜尋樹後序遍歷最後訪問的是根節點,根據根節點將陣列分成兩部分,前面一部分即左子樹值小於根節點值,後面一部分即右子樹的值大於根節點 再遞迴的檢查...