浙江师范大学论坛's Archiver

异度空间 发表于 2007-11-6 07:43

n叉树的先序非递归遍历

#include<stdio.h>
#define N1 30000001
#define N2 300001
int a[N2],b[N2],m1[N2],m2[N2];
int t[N1],parent[N1];
int i,j,sum,n,m,te;
int mark()
{
    int stk[N2],k,u;
long p;
    k=0;p=0;stk[k]=0;u=0;
while(p!=sum*2+1)
{
  if(u<n&&a[u]<=b[u])
  {
   k++;p++;
   stk[k]=a[u];
   if(stk[k]<n) m1[stk[k]]=p;
   else t[stk[k]]=p;
   u=a[u];
  }
  else
  {   
   p++;
   if(stk[k]<n) m2[stk[k]]=p;
   else t[stk[k]]=p;
   k--;
   u=parent[u];
   a[u]=a[u]+1;
  }
}
    return 0;
}
int main()
{
    int ii,k1,k2,kase;
    scanf("%d",&kase);
    for (ii=1;ii<=kase;++ii)
    {
        scanf("%d",&n);
        sum=0;
        for(i=0;i<n;++i)
  {
            scanf("%d",&te);
            a[i]=sum+1;b[i]=sum+te;
   for(j=1;j<=te;j++) parent[j+sum]=i;
   sum+=te;
        }
        mark();
        scanf("%d",&m);
        printf("Case %d:\n",ii);
        for (i=1;i<=m;++i)
  {
            scanf("%d%d",&k1,&k2);
            if (k1==k2) printf("No\n");
   else
    if (k1>=n)
                    printf("No\n");
   else
   if (k2>=n)
                    if ((m1[k1]<t[k2])&&(t[k2]<m2[k1]))
                        printf("Yes\n");
                    else printf("No\n");
    else
                    if((m1[k1]<m1[k2])&&(m2[k1]>m2[k2]))
                        printf("Yes\n");
                    else printf("No\n");
        }
        if (ii<kase) printf("\n");
    }
    return 0;
}

页: [1]

网站web安全
检测认证
公共信息网络
安全备案
电子公告服务
备案网站
信息网络安全
报警服务
网络不良信息
举报中心

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.