欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

横向打印二叉树

程序员文章站 2022-06-04 20:04:23
历届试题 横向打印二叉树 时间限制:1.0s 内存限制:256.0MB 时间限制:1.0s 内存限制:256.0MB 问题描述 二叉树可以用于排序。其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树。 当遇到空子树时,则把该节点放入那个位置。 比如 ......
  历届试题 横向打印二叉树  
时间限制: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;
}

 

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