笛卡尔树

来源:互联网 发布:软件的技术特点 编辑:程序博客网 时间:2024/04/29 07:23

双关键字,关于K1的二叉搜索树,关于K2的最小堆。
判断中序遍历是否为递增,即可判断是否为二叉搜索树。
最小堆 看路径是否递增即可。

#include<stdio.h>#include<string.h>#include<stdlib.h>struct node{    int l,r,k1,k2;}a[1005];int num[1005],cnt=0,flag;int vis[1005]={0};void dfs(int x,int cmp){    if(flag)return;    if(x==-1)return;    if(a[x].k2<=cmp) {flag=1;return;}    dfs(a[x].l,a[x].k2);    dfs(a[x].r,a[x].k2);}void zdfs(int x){    if(x==-1) return;    zdfs(a[x].l);    num[cnt++]=a[x].k1;    zdfs(a[x].r);}int main(){    int n;    scanf("%d",&n);    for(int i=0;i<n;i++)    {        scanf("%d%d%d%d",&a[i].k1,&a[i].k2,&a[i].l,&a[i].r);        if(a[i].l!=-1)vis[a[i].l]++;        if(a[i].r!=-1)vis[a[i].r]++;    }    int pos;    for(pos=0;pos<n;pos++)        if(!vis[pos])            break;    flag=0;    zdfs(pos);    for(int i=1;i<n;i++)        if(num[i]<=num[i-1])        {            flag=1;break;        }    if(flag){puts("NO");return 0;}    dfs(pos,-0x3f3f3f3f);    flag?puts("NO"):puts("YES");}
0 0
原创粉丝点击