二叉搜索树

二叉搜索树的中序遍历一定是一个递增序列

#include<bits/stdc++.h>
using namespace std;
int const N=1e3+7;
int n;
int a[N];
struct node{
    int w;
    node *l,*r;
};
node* dfs(int l,int r,int f){
    if(l>r) return NULL;
    int i=0;
    node *rt=new node;
    rt->w =a[l];
    if(f==0){
        for(i=l+1;i<=r;++i){
            if(a[i]>=a[l]) break;
        }
    }
    else {
        for(i=l+1;i<=r;++i){
            if(a[i]<a[l]) break;
        }
    }
    rt->l =dfs(l+1,i-1,f);
    rt->r =dfs(i,r,f);
    return rt;
}
int cnt,b[N];
void dfs2(node *rt){
    if(rt==NULL) return ;
    dfs2(rt->l );
    b[++cnt]=rt->w ;
    dfs2(rt->r );
}
int pan(node *rt,int f){
    cnt=0;
    dfs2(rt);
    if(f==0){
        for(int i=2;i<=cnt;++i){
            if(b[i-1]>b[i]) return 0;
        }
    }
    else{
        for(int i=2;i<=cnt;++i){
            if(b[i-1]<b[i]) return 0;
        }
    }
    return 1;
}
void dfs3(node* rt){
    if(rt==NULL) return ;
    dfs3(rt->l );
    dfs3(rt->r );
    b[++cnt]=rt->w ;
}
int main(){
    cin >> n;
    for(int i=1;i<=n;++i) cin >> a[i];
    node *rt;
    rt=dfs(1,n,0);
    if(pan(rt,0)){
        cout << "YES\n";
        cnt=0;
        dfs3(rt);
        for(int i=1;i<=cnt;++i){
            cout << b[i];
            if(i!=n) cout << " ";
        }
        return 0;
    }
    rt=dfs(1,n,1);
    if(pan(rt,1)){
        cout << "YES\n";
        cnt=0;
        dfs3(rt);
        for(int i=1;i<=cnt;++i){
            cout << b[i];
            if(i!=n) cout << " ";
        }
        return 0;
    }
    cout << "NO";
    return 0;
}
全部评论

相关推荐

12-15 11:27
门头沟学院 Java
哇哇的菜鸡oc:所有人不要理会,就好了,后面他就知道怎么回事了,只能说有的时候市场都是被宰的人搞坏的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务