題目10:二叉搜尋樹的後序遍歷序列
阿新 • • 發佈:2019-01-24
- 題目描述:
-
輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的陣列的任意兩個數字都互不相同。
- 輸入:
-
每個測試案例包括2行:
第一行為1個整數n(1<=n<=10000),表示陣列的長度。
第二行包含n個整數,表示這個陣列,陣列中的數的範圍是[0,100000000]。
- 輸出:
-
對應每個測試案例,如果輸入陣列是某二叉搜尋樹的後序遍歷的結果輸出Yes,否則輸出No。
- 樣例輸入:
-
7
5 7 6 9 11 10 8
4
7 4 6 5
- 樣例輸出:
-
Yes
No
本題意思就是判斷輸入的二叉樹的後序遍歷,判斷這棵樹是否是二叉搜尋樹。而且根據二叉搜尋樹的性質:根結點值大於左子樹,小於右子樹。 因此,從根結點出發,向前找到所有連續的大於根結點的值作為右子樹,再往前的所有連續小於根結點的作為左子樹,如果往前還有大於根結點的,則不是二叉搜尋樹的後序遍歷結果。 以下是AC程式碼: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <cctype> #include <cstdlib> #include <string.h> #include <algorithm> #include <cmath> using namespace std; #define N 10100 int judge(int n,int p[]) { if(n <= 2) return 1; int i , pos; pos = p[n - 1];//根結點 for(i = 0;i <n - 1;i++)//左子樹 if(p[i] > pos) break; for(;i < n - 1;i++)//右子樹 if(p[i] < pos) return 0; return 1; } int main() { int n , i; int p[N]; while(scanf("%d",&n) == 1) { for(i = 0;i < n;i++) scanf("%d",&p[i]); if(judge(n,p)) printf("Yes\n"); else printf("No\n"); } return 0; }