继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

横向打印二叉树

米脂
关注TA
已关注
手记 492
粉丝 88
获赞 591

历届试题 横向打印二叉树  

时间限制:1.0s   内存限制:256.0MB

问题描述

二叉树可以用于排序。其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树。

当遇到空子树时,则把该节点放入那个位置。

比如,10 8 5 7 12 4 的输入顺序,应该建成二叉树如下图所示,其中.表示空白。

...|-12
10-|
...|-8-|
.......|...|-7
.......|-5-|
...........|-4

本题目要求:根据已知的数字,建立排序二叉树,并在标准输出中横向打印该二叉树。

输入格式

输入数据为一行空格分开的N个整数。 N<100,每个数字不超过10000。

输入数据中没有重复的数字。

输出格式

输出该排序二叉树的横向表示。为了便于评卷程序比对空格的数目,请把空格用句点代替:

样例输入1

10 5 20

样例输出1

...|-20
10-|
...|-5

样例输入2

5 10 20 8 4 7

样例输出2

.......|-20
..|-10-|
..|....|-8-|
..|........|-7
5-|
..|-4

 

#include<iostream>#include<algorithm>using namespace std;char ch[200][200];int getbit(int x)
{    int sum=0;    while(x)
    {
        sum++;
        x/=10;
    }    return sum;
}class tree
{public:
    tree(int x_)
    {
        val=x_;
        bit=getbit(x_);
        par=0;
        x=100;
        y=0;
        l_sum=0;
        r_sum=0;

    }
    tree()
    {
        val=-1;
        bit=0;
        par=0;
         x=100;
        y=0;
        l_sum=0;
        r_sum=0;

    }public:
    tree *lchild=NULL;
    tree *rchild=NULL;    int val;    int bit;    int par;    int x;    int y;    int l_sum;    int r_sum;


};int Print( tree *t)
{    if(t->val!=-1){            int b=t->bit,v=t->val;     for(int i=t->y+b-1;i>=t->y ;i--){
          ch[t->x][i]=v%10+'0';
          v/=10;

     }    if(t->l_sum||t->r_sum){//根节点
        ch[t->x][t->y+t->bit]='-';
    }    if(t->par)ch[t->x][t->y-1]='-';    if(t->lchild->val!=-1&&t->rchild->val!=-1){            for(int i= t->x-t->lchild->r_sum-1;i<=t->x+t->rchild->l_sum+1;i++){
                ch[i][t->y+t->bit+1]='|';
            }
            t->lchild->x=t->x-t->lchild->r_sum-1;
            t->rchild->x=t->x+t->rchild->l_sum+1;


    }    else if(t->lchild->val!=-1){        for(int i= t->x-t->lchild->r_sum-1;i<=t->x;i++){
                ch[i][t->y+t->bit+1]='|';
            }
            t->lchild->x=t->x-t->lchild->r_sum-1;


    }    else if(t->rchild->val!=-1){          for(int i= t->x ;i<=t->x+t->rchild->l_sum+1;i++){
                ch[i][t->y+t->bit+1]='|';
            }

            t->rchild->x=t->x+t->rchild->l_sum+1;

    }
    }    if(t->rchild->val!=-1)Print(t->rchild);    if(t->lchild->val!=-1)Print(t->lchild);    return t->r_sum;



}void build(tree *t,tree *T)
{    if(T->val==-1)
    {

        T->val=t->val;
        T->bit=t->bit;
        T->x=t->x;
        T->y=t->y;
        T->l_sum=t->l_sum;
        T->r_sum=t->r_sum;
        T->lchild=new tree();
        T->rchild=new tree();
        T->lchild->par=1;
        T->rchild->par=1;

    }    else if(T->val<t->val)
    {
        T->r_sum++;
        t->y+=(3+T->bit);
        build(t,T->rchild);


    }    else
    {
        T->l_sum++;
        t->y+=(3+T->bit);
        build(t,T->lchild);

    }




}int main()
{    int num;

    tree *Tree = new tree();
    tree *t;    int n=0;    int j;    while(cin>>num)
    {
        t = new tree(num);

        build(t,Tree);
        n++;

    }  for(int i=0;i<200;i++){//将数组初始化为.矩阵
    for(int j=0;j<200;j++){
        ch[i][j]='.';
    }
}  int x=  Print(Tree);    for(int i=100+x;i>=101-(n-x) ;i--){    for(  j=110;j;j--)
    {        if(ch[i][j]!='.')break;



    }    for(int k=0;k<=j;k++){
         cout<<ch[i][k];
    }
    cout<<endl;

  }    return 0;
}


解题思路,先建立排序二叉树,然后从根节点开始遍历,将数打印到一个二维数组中,然后输出二维数组;

作者:徐义宝

原文链接:https://www.cnblogs.com/xuyibao/p/10464238.html


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP