題目:
輸入一個整數數組,判斷該數組是不是某二叉樹的後序遍歷結果。如果是,則返回true,否則返回false。假設輸入的數組的任意兩個數字互不相同。
在後序遍歷得到的序列中,最後一個數字是樹的根結點。數組中前面的數字可以分爲兩部分:第一部分是左子樹的結點,它們都比根結點小;第二部分是右子樹的結點,它們都比根結點大。
以數組{5,7,6,9,11,10,8}爲例,後序遍歷的結果的最後一個數字8是根結點。在這個數組裏,前3個數字5、7、6都比8小,是左子樹結點;後3個數字9、11、10都比8大,是右子樹結點。接下來採取遞歸,可以確定數組每一部分對應的子樹結構。
如果給定數組中第一個元素就大於根結點,則證明不存在左子樹。
比如{7,4,6,5},因爲7>5,所以不存在左子樹,繼續往後,發現右子樹中有4的存在,而4<5,與之矛盾,因此該二叉搜索樹是不存在的。
bool VerifySquenceOfBST(int sequence[],int length)
{
if(sequence==NULL || length<=0)
return false;
int root=sequence[length-1];
//在二叉搜索樹中,左<根<右
int i=0;
for(;i<length-1;i++)
{
if(sequence[i]>root)
break;
}
int j=i;
for(;j<length-1;j++)
{
if(sequence[j]<root)
return false;
}
//判斷左子樹是否爲二叉搜索樹
bool left=false;
if(i>0)
left=VerifySquenceOfBst(sequence,i);
//判斷右子樹是否爲二叉搜索樹
bool right=false;
if(i<length-1)
right=VerifySquenceOfBst(sequence+i,length-i-1);
return (left && right);
}
如果要求處理一棵二叉樹的遍歷序列,我們可以先找到二叉樹的根結點,再基於根結點把整棵樹的遍歷序列拆分成左子樹和右子樹。在遞歸處理這兩個子序列。