zoukankan      html  css  js  c++  java
  • [蓝桥杯][2013年第四届真题]横向打印二叉树

    时间限制: 1Sec 内存限制: 128MB 提交: 2 解决: 1

    题目描述
    二叉树可以用于排序。其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树。 
    当遇到空子树时,则把该节点放入那个位置。  
    比如,10  8  5  7  12  4  的输入顺序,应该建成二叉树如下图所示,其中.表示空白。 
    ...|-12 
    10-| 
    ...|-8-| 
    .......|...|-7 
    .......|-5-| 
    ...........|-4  
    本题目要求:根据已知的数字,建立排序二叉树,并在标准输出中横向打印该二叉树。  
    输入
    输入数据为一行空格分开的N个整数。  N< 100,每个数字不超过10000。 
    输入数据中没有重复的数字。  
    输出
    输出该排序二叉树的横向表示。为了便于评卷程序比对空格的数目,请把空格用句点代替。
    样例输入
    10  5  20  
    样例输出
    ...|-20
    10-|
    ...|-5
    /*
    ...|-12 
    10-| 
    ...|-8-| 
    .......|...|-7 
    .......|-5-| 
    ...........|-4 
    */
    #include<stdio.h>
    #define maxn 110
    char str[110][1000];
    int cnt=1;
    struct Node{
        int data;
        int lson,rson;
        int num;
        int p;
        int v;//垂直方向上的位置 
        Node()
        {
            data=-1;
            lson=-1;
            rson=-1;
            num=-1;
            p=-1;
            v=-1; 
        }
        Node(int _data,int _lson,int _rson,int _num,int _p)
        {
            data=_data;
            lson=_lson;
            rson=_rson;
            num=_num;
            p=_p;
            v=-1;
        }
    }tree[maxn];
    int n=0;
    void build_tree(int root,int data,int num)
    {
        if(data<tree[root].data)
        {
            if(tree[root].lson!=-1) build_tree(tree[root].lson,data,num);
            else 
            {
                tree[root].lson=num;
                tree[num].data=data;
                tree[num].lson=tree[num].rson=-1;
                tree[num].num=num;
                tree[num].p=-1;
            }
        }
        else if(data>tree[root].data)
        {
            if(tree[root].rson!=-1) build_tree(tree[root].rson,data,num);
            else 
            {
                tree[root].rson=num;
                tree[num].data=data;
                tree[num].lson=tree[num].rson=-1;
                tree[num].num=num;
                tree[num].p=-1;
            }
        }
    }
    int len(int x)
    {
        int sum=0;
        if(x==0 ) return 1;
        while(x)
        {
            sum++;
            x/=10;
        }
        return sum;
    }
    void PT(int root,int L)
    {
        if(tree[root].rson!=-1) PT(tree[root].rson,L+len(tree[root].data)+(root==0?2:4)-1); 
        for(int i=0;i<L;i++) str[cnt][i]='.'; 
        tree[root].v=cnt;
        sprintf(str[cnt++]+L,"%s%d%s",(root==0?"":"|-"),tree[root].data,((tree[root].lson==-1&&tree[root].rson==-1)?"":"-|"));
        if(tree[root].lson!=-1 || tree[root].rson!=-1) tree[root].p=L+len(tree[root].data)+(root==0?2:4)-1;
        if(tree[root].lson!=-1) PT(tree[root].lson,L+len(tree[root].data)+(root==0?2:4)-1);
    }
    void Format(int root)
    {
        if(tree[root].lson==-1 && tree[root].rson==-1) return ;
        if(tree[root].rson!=-1) 
        {
            for(int i=tree[tree[root].rson].v+1;i<tree[root].v;i++) str[i][tree[root].p]='|';
            Format(tree[root].rson);
        }
        if(tree[root].lson!=-1) 
        {
            for(int i=tree[root].v+1;i<tree[tree[root].lson].v;i++) str[i][tree[root].p]='|'; 
            Format(tree[root].lson);
        }
    }
    int main(void)
    {
        int data;
        scanf("%d",&data);
        tree[0]=Node(data,-1,-1,n++,-1);
        while(scanf("%d",&data)!=EOF)
        {
            build_tree(0,data,n++);
        }
        PT(0,0);
        Format(0);
        for(int i=1;i<cnt;i++) printf("%s
    ",str[i]);
        return 0;
    }
  • 相关阅读:
    实现一个可host asp.net程序的小型IIS(Cassinidev介绍)
    json数组对象和对象数组
    select 操作大全动态增中值
    jquery将某些ID显示出来
    如何合理利用好nofollow标签
    javascript读写COOKS
    [PHPNow] 使用PHPNOW常见的10个问题
    repeate 常用的每行显示几个共几行
    java学习之面向对象(this,static,pakage,import)
    Java学习之面向对象(1.Object类,(1)toString方法,(2)equals方法,2.对象转型(casting),3.动态绑定与多态,4.抽象类(abstract),5.Final关键字)
  • 原文地址:https://www.cnblogs.com/zuimeiyujianni/p/8888033.html
Copyright © 2011-2022 走看看