zoukankan      html  css  js  c++  java
  • 横向打印二叉树

      历届试题 横向打印二叉树  
    时间限制: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;
    }
    解题思路,先建立排序二叉树,然后从根节点开始遍历,将数打印到一个二维数组中,然后输出二维数组;
  • 相关阅读:
    CentOS 7 调整home大小
    跨站请求拦截
    SVN操作
    openoffice安装
    MySQL报错ERROR 1436 (HY000): Thread stack overrun:
    jolokia配置Java监控
    elasticksearch分词,导致kibana的url出现问题
    C语言scanf跳出循环的问题
    Jenkins远程代码执行漏洞
    ActiveMQ FileServer漏洞(详细)
  • 原文地址:https://www.cnblogs.com/xuyibao/p/10464238.html
Copyright © 2011-2022 走看看