1.問題描述
題目:輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則返回true,否則返回false。假設輸入的數組的任意兩個數字都互不相同。
例如,輸入數組{5,7,6,9,11,10,8}
,則返回true,數組{7,4,6,5}
,則返回false。
2.分析
- 什麼是二叉搜素樹?若左子樹不爲空,則左子樹上節點的值都小於根節點值,若右子樹不爲空,則右子樹上節點的值都打印根節點的值;
- 此題一看,就知道是二叉搜索樹是一個遞歸定義,我們使用遞歸的方法;
例如:輸入{5,7,6,9,11,10,8}
,其中8是根節點,那麼{5,7,6}
都小於8,所以,是左子樹;{11,10,8}
都大於8,,所以是右子樹。
之後分別分析{5,7,6}
,{11,10,8}
,都是一樣的。
使用遞歸,那麼要有退出遞歸的條件,即:遞歸邊界,邊界應該是,一顆樹只有一個節點,即:一顆樹其實是一個葉子節點的時候,那麼就停止,返回true。
相反,如何判斷不是二叉搜索樹?比如{7,4,6,5}
,應爲7大於5,那麼左子樹爲{}
,右子樹爲{7,4,6}
,但是右子樹的4小於5,所以錯誤。這不是一顆二叉搜索樹。
3.源代碼:
// from [start,end)
bool VerifySquenceOfBSTCore(int sequence[],int start,int end)
{
//若end - start ==1,表示此二叉樹是一個葉子節點
if(end - start == 1)
return true;
int rootValue = sequence[end - 1];
int leftIndex = 0;
while(leftIndex < end -1 && sequence[leftIndex] < rootValue ) ++leftIndex;
int rightIndex = leftIndex;
while(rightIndex<end -1 && sequence[rightIndex] > rootValue) ++rightIndex;
//如果右子樹全部都大於根節點的值,則rightIndex應該是等於end - 1
if(rightIndex != end -1)
return false;
bool leftTrue = true;
if(leftIndex > 0)
leftTrue = VerifySquenceOfBSTCore(sequence,0,leftIndex);
bool rigthTrue = true;
if(leftIndex < end -1)
rigthTrue = VerifySquenceOfBSTCore(sequence,leftIndex,rightIndex);
return leftTrue&&rigthTrue;
}
bool VerifySquenceOfBST_1(int sequence[], int length)
{
if(sequence == nullptr || length <=0)
return false;
return VerifySquenceOfBSTCore(sequence,0,length);
}
4.結論
- 知道什麼是二叉搜索樹
- 二叉搜索樹的後序遍歷
- 涉及到樹,很多時候使用遞歸方法可以方便解決問題