• 横向打印二叉树


      历届试题 横向打印二叉树  
    时间限制: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;
    }
    解题思路,先建立排序二叉树,然后从根节点开始遍历,将数打印到一个二维数组中,然后输出二维数组;
  • 相关阅读:
    在项目开始前,为客户做专门的“需求变更流程”培训是必要的
    代码优化四部曲:“拆套”、“解耦”、”封装“、“重构”
    这个博客的目的就是解构程序猿的世界观
    如果3D技术仅仅只是用于游戏和娱乐,那真是太暴殄天物了
    如何用Xcode 4.5开发3.5寸屏幕的iPhone 应用程序?
    所谓开发经验,其实就是对业务流程的积累
    项目经理必备的两大能力
    XML文件总是无法读取其中的数据
    在switch的case语句后,使用UIAlertView报错
    代码编写原则
  • 原文地址:https://www.cnblogs.com/xuyibao/p/10464238.html
Copyright © 2020-2023  润新知