zoukankan      html  css  js  c++  java
  • 寒假Day30:二叉树的遍历相关题型(求先序或后序、搜索树的判断)

    HDU1710 - Binary Tree Traversals

    题意:已知前序中序求后序

    思路:模板题

    AC代码:

    #include<stdio.h>
    #include<algorithm>
    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    const int N=1010;
    
    int pre[N],in[N],post[N],id[N],p;
    
    //前序起点、前序终点、中序起点、中序终点
    void dfs(int l,int r,int L,int R)
    {
        int root=id[pre[l]];
        int ls=root-L;//中序左子树节点个数
        int rs=R-root;//中序右子树节点个数
        if(ls)//左子树非空
            dfs(l+1,l+root,L,root-1);    //dfs(l+1,l+root-1,L,root-1); 也能过
        if(rs)//右子树非空
            dfs(l+ls+1,r,root+1,R);
        post[++p]=pre[l];//当左子树是空的右子树也是空的说明是叶节点、记录即可
    }
    int main()
    {
        int n;
        while(cin>>n)
        {
            p=0;
            for(int i=1;i<=n;i++)
                cin>>pre[i];
            for(int i=1;i<=n;i++)
            {
                cin>>in[i];
                id[in[i]]=i;
            }
            dfs(1,n,1,n);
            for(int i=1;i<n;i++)
                cout<<post[i]<<" ";
            cout<<post[n]<<endl;
        }
        return 0;
    }
    

    计蒜客T2113 - 求先序排列

    题意:已知中序后序求先序

    思路:模板题

    AC代码:

    #include<string.h>
    #include<iostream>
    #include<stdio.h>
    #include<algorithm>
    #include<queue>
    #include<map>
    #include<cmath>
    using namespace std;
    #define inf 0x3f3f3f3f
     const int N=500200*2;
    
     char s1[10],s2[10];
     void w(int l1,int r1,int l2,int r2)
     {
         int k=-1;
         for(int i=l1; i<r1; i++)
         {
             if(s1[i]==s2[r2-1])
             {
                 printf("%c",s1[i]);
                 k=i;
                 break;
             }
         }
         if(k>l1) //左
             w(l1,k,l2,k-l1+l2);
         if(r1>k+1) //右
             w(k+1,r1,k-l1+l2,r2-1);
     }
    
     int main()
     {
         cin>>s1>>s2;
         int l1=strlen(s1);
         int l2=strlen(s2);
         w(0,l1,0,l2);
         return 0;
     }
    

    HDU3791 - 二叉搜索树

    题意:判断两个序列是否能够构成二叉搜索树

    思路:利用中序遍历

    AC代码:

    #include<stdio.h>
    #include<algorithm>
    #include<iostream>
    #include<string.h>
    using namespace std;
    typedef long long ll;
    
    char a[15],b[15];
    bool flag;
    
    struct node
    {
        int x;// 值
        node *l,*r;
    };
    
    node *insertt(node *p,int xx)//依次插入每个值
    {
        if(p==NULL)//如果当前节点为空则插入
        {
            node *q=new node;//申请一个动态空间
            q->x=xx;//赋值
            q->l = q->r =NULL;//左右儿子为空
            return q;//返回此节点的地址
        }
        //说明有值,继续往下找,遵循左小右大
        if(p->x>xx)//xx<左儿子,继续往左走
            p->l=insertt(p->l,xx);
        else
            p->r=insertt(p->r,xx);
        return p;
    }
    
    void check(node *root,node *tree)//传入地址
    {
        if(root!=NULL&&tree!=NULL)//说明此节点两棵树都有值,只需判断值是否相等
        {
            check(root->l,tree->l);//中序遍历
            if(root->x!=tree->x)//判断此节点的值是否和标准树相等
                flag=0;
            check(root->r,tree->r);
        }
        else if(root!=NULL||tree!=NULL)//只有一个节点有值
            flag=0;
    }
    
    int main()
    {
        int n;
        while(~scanf("%d",&n)&&n)
        {
            node *root=NULL;//标准树地址为空
            scanf("%s",a);
            int la=strlen(a);
            for(int i=0; i<la; i++)
                root=insertt(root,a[i]-'0');//构建一颗标准树
            for(int i=1; i<=n; i++)
            {
                flag=1;
                node *tree=NULL;//判断树地址为空
                scanf("%s",b);
                int lb=strlen(b);
                for(int i=0; i<lb; i++)
                    tree=insertt(tree,b[i]-'0');
                check(root,tree);
                if(flag)
                    printf("YES\n");
                else
                    printf("NO\n");
            }
        }
        return 0;
    }
    
  • 相关阅读:
    51nod 1445 变色DNA ( Bellman-Ford算法求单源最短路径)
    51nod 1307 绳子与重物 (标记父节点更新即可)
    AOJ GRL_1_C: All Pairs Shortest Path (Floyd-Warshall算法求任意两点间的最短路径)(Bellman-Ford算法判断负圈)
    AOJ GRL_1_B: Shortest Path
    AOJ GRL_1_A: Single Source Shortest Path (Dijktra算法求单源最短路径,邻接表)
    【算法】prim算法(最小生成树)(与Dijkstra算法的比较)
    【算法】Dijkstra算法(单源最短路径问题)(路径还原) 邻接矩阵和邻接表实现
    【算法】Bellman-Ford算法(单源最短路径问题)(判断负圈)
    面试之二:Redis是单线程还是多线程?以及处理模型。
    面试之一:CMS收集器整理
  • 原文地址:https://www.cnblogs.com/OFSHK/p/12316879.html
Copyright © 2011-2022 走看看