横向打印二叉树
历届试题 横向打印二叉树
时间限制:1.0s 内存限制:256.0MB
问题描述
二叉树可以用于排序。其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树。
当遇到空子树时,则把该节点放入那个位置。
比如,10 8 5 7 12 4 的输入顺序,应该建成二叉树如下图所示,其中.表示空白。
...|-12
10-|
...|-8-|
.......|...|-7
.......|-5-|
...........|-4
10-|
...|-8-|
.......|...|-7
.......|-5-|
...........|-4
本题目要求:根据已知的数字,建立排序二叉树,并在标准输出中横向打印该二叉树。
输入格式
输入数据为一行空格分开的N个整数。 N<100,每个数字不超过10000。
输入数据中没有重复的数字。
输出格式
输出该排序二叉树的横向表示。为了便于评卷程序比对空格的数目,请把空格用句点代替:
样例输入1
10 5 20
样例输出1
...|-20
10-|
...|-5
10-|
...|-5
样例输入2
5 10 20 8 4 7
样例输出2
.......|-20
..|-10-|
..|....|-8-|
..|........|-7
5-|
..|-4
..|-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; }
解题思路,先建立排序二叉树,然后从根节点开始遍历,将数打印到一个二维数组中,然后输出二维数组;