zoukankan      html  css  js  c++  java
  • HDU_1710_二叉树前序中序确定后序

    2018-3-6

    按照王道机试书上的思路再做了一遍,先根据先序和中序建树,然后后序遍历。

    静态分配数组用于建树,可以返回数组地址当作结点指针。

    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    int pre[1005],in[1005],n;
    
    struct Node 
    {
        Node *lson,*rson;
        int num;     
    }node[1005];  //静态分配一个数组用于建树
    
    int cntn;
    
    Node *create(int num)
    {
        node[cntn].lson=node[cntn].rson=NULL;
        node[cntn].num=num;
        return &node[cntn++]; //返回数组元素的地址
    }
    
    Node *build(int ph,int ih,int len)
    {
        Node *now=create(pre[ph]);
        int i;
        for(i=1;pre[ph]!=in[i];i++);
        if(i!=ih)
            now->lson=build(ph+1,ih,i-ih);
        if(i!=ih+len-1)
            now->rson=build(ph+i-ih+1,i+1,len-(i-ih)-1);
        return now;
    }
    
    int cnt;
    void postOrder(Node *rt)
    {
        if(rt==NULL)
            return;
        postOrder(rt->lson);
        postOrder(rt->rson);
        printf("%d",rt->num);
        if(++cnt==n)
            printf("
    ");
        else 
            printf(" ");
    }
    
    int main()
    {
        while(scanf("%d",&n)!=EOF)
        {
            cntn=cnt=0;
            for(int i=1; i<=n; i++)
                scanf("%d",&pre[i]);
            for(int i=1; i<=n; i++)
                scanf("%d",&in[i]);
            Node *rt=build(1,1,n);
            postOrder(rt);
        }
        return 0;
    }

    2018-3-3

    又做了一遍,这次是自己根据思想自己码了一遍

    看了上次的代码,感觉还是上次的好一点

    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    int pre[1005],in[1005],cnt,n;
    
    void getPost(int pl,int pr,int il,int ir)
    {
        if(pr<pl||ir<il)
            return;
        int loc;
        for(int i=il; i<=ir; i++)
            if(in[i]==pre[pl])
            {
                loc=i;
                break;
            }
        if(0<loc-il)
            getPost(pl+1,pl+loc-il,il,loc-1);
        if(0<ir-loc)
            getPost(pr-(ir-loc)+1,pr,loc+1,ir);
        printf("%d",pre[pl]);
        cnt++;
        if(cnt==n)
            printf("
    ");
        else
            printf(" ");
    
    }
    int main()
    {
        while(scanf("%d",&n)!=EOF)
        {
            cnt=0;
            for(int i=1; i<=n; i++)
                scanf("%d",&pre[i]);
            for(int i=1; i<=n; i++)
                scanf("%d",&in[i]);
            getPost(1,n,1,n);
        }
        return 0;
    }

    2018-1-3

    研究生考试初试结束一个周了,开始准备复试了,又要开始刷题了。

     

    给定一个二叉树前序和中序,确定后序。

    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    int pre[1005],in[1005];
    
    void getPostOrder(int ph,int ih,int len,int flag)
    {
        if(len<1)
            return;
        int i;
        for(i=0; pre[ph]!=in[ih+i]; i++);  //在中序中找到根节点
        getPostOrder(ph+1,ih,i,0);     //处理左子树
        getPostOrder(ph+i+1,ih+i+1,len-i-1,0);  //处理右子树
        if(flag)
            printf("%d
    ",pre[ph]);
        else
            printf("%d ",pre[ph]);
    }
    
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF)
        {
            for(int i=0; i<n; i++)
                scanf("%d",&pre[i]);
            for(int i=0; i<n; i++)
                scanf("%d",&in[i]);
            //cout<<"*"<<endl;
            getPostOrder(0,0,n,1);
        }
        return 0;
    }
  • 相关阅读:
    windows 乱码之 gbk 与 cp936
    jdcli 在命令行反编译jar包
    建议博客园向独立博客提供发布到首页的服务
    IsByRef在什么情况下为true?
    Hibernate里自定义UserType时取不到值的问题
    解决安装Visual Studio 2010 SP1时被NDP40KB2468871.exe补丁卡死以及mscorsvw.exe进程CPU占用率高的问题
    FROM WAS7/JDK5 TO WAS6/JDK4
    C++山寨C#中的DataTable
    程序员的自我修养读书笔记
    Web开发之路
  • 原文地址:https://www.cnblogs.com/jasonlixuetao/p/8184238.html
Copyright © 2011-2022 走看看