二叉搜索树

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

#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;
}
全部评论

相关推荐

牛至超人:把哈工大,再加大加粗,看见闪闪发光的哈工大字样,面试官直接流口水
投递字节跳动等公司6个岗位
点赞 评论 收藏
分享
11-04 19:05
已编辑
东莞城市学院 单片机
不知道怎么取名字_:你这个要实习两年?哪有这么久的,感觉就是即使你毕业了,但还按实习的话,是不是不用给你缴社保公积金啥的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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