題目:輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則返回true,否則返回false。假設輸入的數組的任意兩個數字都互不相同。
二叉搜索樹規律:
1、若 左子樹 不空,則 左子樹上所有結點的值 均小於它的根結點的值。
2、若 右子樹 不空,則 右子樹上所有結點的值 均大於它的根結點的值。
3、左右子樹也分別爲二叉搜索樹。
舉例1:
輸入數組:{5、7、6、9、11、10、8}
後序遍歷規律:左 - 右 - 根
5小於8====》5、7、6 左子樹 ===判斷是否都小於8====》是 ====遞歸====》5 左子樹;7 右子樹;6 根 ======》符合
9大於8====》9、11、10 右子樹 ===判斷是否都大於8====》是====遞歸=====》9 左子樹;11 右子樹;10 根======》符合
====》8 根
舉例2:
輸入數組:{7,4,6,5}
====》5 根
====》7大於5,因此 7、4、6 ====》屬於右子樹 ===判斷是否都大於5==》否===》說明不是 二叉搜索樹後序遍歷序列
算法如下:
bool VerifySquenceofBST(int a[],int length)
{
if(NULL == a || length <= 0)
return false;
int pRoot = length - 1;
/**二叉搜索樹的四個規律*/
/**1、在二叉搜索樹中左子樹的結點小於於根結點*/
int i = 0;
while(i < length - 1)
{
if(a[i] > a[pRoot])
break;
i++;
}
/**2、在二叉搜索樹中右子樹的結點大於根結點*/
int j = i;
while(j < length - 1)
{
if(a[j] < a[pRoot])
return false;
j++;
}
/**3、判斷左子樹是不是二叉搜索樹*/
bool left = true;
if(i > 0)
left = VerifySquenceofBST(a, i);
/**4、判斷右子樹是不是二叉搜索樹*/
bool rigth = true;
if(i < length - 1)
rigth = VerifySquenceofBST(a + i, length - i - 1);
return (left && rigth);
}
總結:
舉實例分析,有助理解
算法 與 規律 相對應,分析過程,總結規律。
/* 點滴積累,我的一小步 */