【題目】
輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則返回true,否則返回false。假設輸入的陣列的任意兩個數字都各不相同。
【分析】
假設輸入陣列{5,7,6,9,11,10,8}要判斷它是不是二叉搜尋樹的後序遍歷結果,就要結合二叉搜尋樹特點及後序遍歷的方法來判斷,後序遍歷特點是陣列最後乙個就是二叉樹的根節點,所以由此判斷樹根結點為8,並且先遍歷左子樹,再遍歷右子樹,所以關鍵在於判斷出左子樹右子樹分界點在**。由二叉搜尋樹左子樹小於根節點,右子樹大於根節點的特點就可以找到分界點,{5,7,6}皆小於根節點8,所以其為左子樹,而{9,11,10}大於根節點,所以為右子樹,對左子樹,右子樹分別利用上述判斷方法繼續判斷即可,一旦右子樹**現小於根節點的,則說明此陣列並非為某二叉搜尋樹的後序遍歷結果。
舉一範例:
1. 樹根節點為5;
2. 陣列第乙個元素不小於5,說明樹沒有左子樹,只有右子樹;
3. 對於{7,4,6}都是右子樹結點,理應全都大於5,但是4的存在直接就可以判定,此陣列不為後序遍歷結果。
【測試**】
#include
#include
#define false 0
#define true 1
bool verifysequenceofbst( int sequence[ ], int length )
//在二叉搜尋樹中右子樹的結點大於根結點
int j = i;
for(; j < length - 1 ; ++j )
//判斷左子樹是不是二叉搜尋樹
bool left = true;
if( i > 0 )
left = verifysequenceofbst( sequence, i );
//判斷右子樹是不是二叉搜尋書
bool right = true;
if( i < length - 1)
right = verifysequenceofbst( sequence + i, length - i - 1 );
return left & right;
}void main( )
; if( verifysequenceofbst( s, 7 ))
printf("存在一棵二叉搜尋書,其後序遍歷結果為\n");
else
printf("不存在一棵二叉搜尋書,其後序遍歷結果為\n");
int s2[ ] = ;
if( verifysequenceofbst( s2,7 ))
printf("存在一棵二叉搜尋書,其後序遍歷結果為\n");
else
printf("不存在一棵二叉搜尋書,其後序遍歷結果為\n");
}【輸出】
二叉搜尋樹的後序遍歷序列
題目 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是返回true,否則返回false。假設輸入的陣列的任意兩個數字都不相同。解答 二叉搜尋樹後序遍歷最後訪問的是根節點,根據根節點將陣列分成兩部分,前面一部分即左子樹值小於根節點值,後面一部分即右子樹的值大於根節點 再遞迴的檢查...
二叉搜尋樹的後序遍歷序列
輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。include using namespace std bool verifysquenceofbst int sequence,int length int j...
二叉搜尋樹的後序遍歷序列
輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。class solution 在二叉搜尋樹中右子樹的結點大於根結點 int j i for j0 left verifysquenceofbst lefttree...