zoukankan      html  css  js  c++  java
  • HDU 3999 The order of a Tree

    The order of a Tree

    Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
    Total Submission(s) : 66   Accepted Submission(s) : 35

    Font: Times New Roman | Verdana | Georgia

    Font Size: ← →

    Problem Description

    As we know,the shape of a binary search tree is greatly related to the order of keys we insert. To be precisely:
    1.  insert a key k to a empty tree, then the tree become a tree with
    only one node;
    2.  insert a key k to a nonempty tree, if k is less than the root ,insert
    it to the left sub-tree;else insert k to the right sub-tree.
    We call the order of keys we insert “the order of a tree”,your task is,given a oder of a tree, find the order of a tree with the least lexicographic order that generate the same tree.Two trees are the same if and only if they have the same shape.

    Input

    There are multiple test cases in an input file. The first line of each testcase is an integer n(n <= 100,000),represent the number of nodes.The second line has n intergers,k1 to kn,represent the order of a tree.To make if more simple, k1 to kn is a sequence of 1 to n.

    Output

    One line with n intergers, which are the order of a tree that generate the same tree with the least lexicographic.

    Sample Input

    4
    
    1 3 4 2
    

    Sample Output

    1 3 2 4
    
    

    Source

    2011 Multi-University Training Contest 16 - Host by TJU
    #include <iostream>
    #include<cstdio>
    using namespace std;
    int ans[100005];
    int i,n,k,l;
    struct node
    {
        int num,left,right;
    }tree[100005];
    
    void work(int k)
    {
        if (k==-1) return;
        ans[++l]=tree[k].num;
        if (tree[k].left!=-1) work(tree[k].left);
        if (tree[k].right!=-1) work(tree[k].right);
    }
    int main()
    {
        for(i=1;i<=100005;i++)
        {
            tree[i].num=-1;
            tree[i].left=-1;
            tree[i].right=-1;
        }
        scanf("%d",&n);
        if (n>=1)
            {
                scanf("%d",&k); tree[1].num=k;
                for (i=2;i<=n;i++)
                {
                    scanf("%d",&k);
                    tree[i].num=k;
                    int t=1;
                    while(1)
                    {
                        while (k>tree[t].num && tree[t].right!=-1) t=tree[t].right;
                        if (k>tree[t].num && tree[t].right==-1)
                        {
                            tree[t].right=i;
                            break;
                        }
                        while (k<tree[t].num && tree[t].left!=-1) t=tree[t].left;
                        if (k<tree[t].num && tree[t].left==-1)
                        {
                            tree[t].left=i;
                            break;
                        }
                    }
                }
                l=0;
                work(1);
                for(i=1;i<l;i++) printf("%d ",ans[i]);
                printf("%d\n",ans[l]);
            }
        return 0;
    }
    

      

  • 相关阅读:
    day09总结
    day09作业
    删除循环中选中的id
    数组套数组 获取数据
    vue for each循环出来数组的某一项 再重新合并成一个新数组
    全是没见过的
    vue element 分页
    解决iphonex屏幕过长背景图片或者放在元素里面的图片不能铺满的问题
    实在自动现在APK,微信跳浏览器下载
    js判断是否在微信浏览器中打开
  • 原文地址:https://www.cnblogs.com/stepping/p/5513236.html
Copyright © 2011-2022 走看看