1. 程式人生 > >題目10:二叉搜尋樹的後序遍歷序列

題目10:二叉搜尋樹的後序遍歷序列

題目描述:

輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出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;
}