历届试题 横向打印二叉树
时间限制: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
随时随地看视频