zoukankan      html  css  js  c++  java
  • hdu 1710 Binary Tree Traversals

    根据一颗二叉树的先序遍历结果和中序遍历结果确定后序遍历结果。

    先递归建树,后DFS。代码写了详细的注释~~~~

    至今还不会用指针写数据结构。。只会用结构体模拟。。。

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    const int maxn = 1111;
    struct abc
    {
        int left, right, date;
    }node[maxn];
    int xian[maxn], zhong[maxn];
    int fxian[maxn], fzhong[maxn];
    int flag[maxn];
    int ans[maxn];
    int sum, uu;
    void gettree(int ll, int rr, int fn)//ll和rr表示的是中序的区间
    {
        int i, maxn = -99999999, minn = 99999999;
        //minn maxn为中序ll到rr这段区间在先序的区间
        for (i = ll; i <= rr; i++)
        {
            if (fxian[zhong[i]] > maxn) maxn = fxian[zhong[i]];
            if (fxian[zhong[i]] < minn) minn = fxian[zhong[i]];
        }
        
        //中序ll到rr这段区间的节点为对应的先序序列中的第一个
        node[fn].date = xian[minn];
        
        //这段区间的节点在中序的位置
        int yy = fzhong[xian[minn]];
    
        //构造左子树
        if (yy - ll != 0)
        {
            sum++;
            node[fn].left = sum;
            gettree(ll, yy - 1, sum);
        }
        
        //构造右子树
        if (rr - yy != 0)
        {
            sum++;
            node[fn].right = sum;
            gettree(yy + 1, rr, sum);
        }
    
    }
    void dfs(int wei)//后序遍历 先遍历左儿子 再遍历右儿子 最后遍历节点
    {
        //遍历左儿子
        if (node[wei].left == -1) flag[node[wei].left] = 1;
        else
        {
            
            dfs(node[wei].left);
            if (flag[node[wei].left] == 0) ans[uu] = node[node[wei].left].date, uu++;
            flag[node[wei].left] = 1;
            
        }
        //遍历右儿子
        if (node[wei].right == -1) flag[node[wei].right] = 1;
        else
        {
            
            dfs(node[wei].right);
            if (flag[node[wei].right] == 0) ans[uu] = node[node[wei].right].date, uu++;
            flag[node[wei].right] = 1;
            
        }
        //遍历节点
        flag[wei] = 1;
        ans[uu] = node[wei].date, uu++;
        
    }
    int main()
    {
        int n, i;
        while (~scanf("%d", &n))
        {
            sum = 1; uu = 0;
            memset(flag, 0, sizeof(flag));
            for (i = 0; i <= maxn - 10; i++) node[i].date = -1, node[i].left = -1, node[i].right = -1;
            for (i = 1; i <= n; i++) scanf("%d", &xian[i]);
            for (i = 1; i <= n; i++) scanf("%d", &zhong[i]);
            for (i = 1; i <= n; i++){fxian[xian[i]] = i; fzhong[zhong[i]] = i;}
            gettree(1, n, 1);
            dfs(1);
            for (i = 0; i < uu; i++)
            {
                if (i<uu-1) printf("%d ", ans[i]);
                else printf("%d
    ", ans[i]);
            }
        }
        return 0;
    }
  • 相关阅读:
    浅谈ssh(struts,spring,hibernate三大框架)整合的意义及其精髓
    Spring中ClassPathXmlApplicationContext类的简单使用
    测试计划/系统风险 (设计方面、开发方面、测试本身 等风险)
    浏览器兼容
    4.0 爬虫
    2.1 IDEA
    2.3 接口测试
    1.1测试分类
    1.3 ODPS
    2.1 Word 插入 smartart、图表
  • 原文地址:https://www.cnblogs.com/zufezzt/p/4442004.html
Copyright © 2011-2022 走看看