[蓝桥杯][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\n",str[i]);
    return 0;
}

 

转载于:https://www.cnblogs.com/zuimeiyujianni/p/8888033.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值