PAT L2-004. 这是二叉搜索树吗?

题目链接:PAT L2-004. 这是二叉搜索树吗?

题意:

给你一串数,问你是否是一个二叉搜索树或者是镜像的先序遍历。

如果是,就输出这棵树的后序遍历。

题解:

根据二叉搜索树的性质,模拟判断一下。

 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=a;i<=b;++i)
 3 using namespace std;
 4 
 5 const int N=1e4+7;
 6 
 7 int n,ismirror;
 8 vector<int>pre,ans;
 9 
10 void dfs(int l,int r)
11 {
12     if(r<l)return;
13     int b=l,c=r+1;
14     if(ismirror)
15     {
16         while(b<r&&pre[b+1]>=pre[l])b++;
17         while(c>l+1&&pre[c-1]<pre[l])c--;
18     }else
19     {
20         while(b<r&&pre[b+1]<pre[l])b++;
21         while(c>l+1&&pre[c-1]>=pre[l])c--;
22     }
23     if(c-b!=1)return;
24     dfs(l+1,b),dfs(c,r);
25     ans.push_back(pre[l]);
26 }
27 
28 int main()
29 {
30     scanf("%d",&n);
31     F(i,1,n)
32     {
33         int x;
34         scanf("%d",&x);
35         pre.push_back(x);
36     }
37     dfs(0,n-1);
38     if(ans.size()!=n)ismirror=1,ans.clear(),dfs(0,n-1);
39     if(ans.size()==n)
40     {
41         puts("YES");
42         for(int i=0;i<n;i++)printf("%d%c",ans[i]," \n"[i==n-1]);
43     }else puts("NO");
44     return 0;
45 }
View Code

 

posted @ 2017-04-14 13:42  bin_gege  阅读(256)  评论(0编辑  收藏  举报