1.上面简单的介绍了二叉树的线性存储.
2.分析二叉树的横向打印.
由于在终端上如果不调用系统坐标函数,而只调用printf();来输出,只能是从上到下从左到右进行,根据这一特点我们只需要
知道每个节点所在的x坐标(即前面空了x-1个空格),再加上层次打印就非常容易打印二叉树了,如根节点可以计算的其坐标为
(1,8)第一行第八列.节点置为2的节点坐标(1,6),值为5的节点坐标(1,7).
可以发现一个规律编号为i的节点横坐标为,在中序编列这可二叉树,所对应的次序.
3.根据上述规律可以获得任何节点的横坐标,二纵坐标正好是层数,因此能获得任意节点的横纵坐标
在屏幕输出时从上到下,从左到右,正好通过每个节点的坐标来输出他...但是注意同层i,j,空行是jx-ix这是因为终端从
做到有输出,且累计输出个数.
下面是运行效果,和程序
已建立图上这颗二叉树为例演示.
代码:
#include <stdio.h>
#include <string.h>
#define maxn 10010
#define OVER -1
int tree[maxn]={0};
int pos[maxn]={0};
int count=1;
int my_log2(int n){
int c=0;
while(n>=2){
c++;
n/=2;
}
return c;
}
int my_pow(int m,int n){
if(n==0)
return 1;
else{
int ans=my_pow(m,n/2);
ans*=ans;
return n%2?ans*m:ans;
}
}
void init(){
memset(tree,-1,sizeof(tree));
}
void create(int no){
scanf("%d",&tree[no]);
if(tree[no]!=OVER){
tree[0]++;
create(no*2);
create(no*2+1);
}
}
void postorder(int no,int space){
if(tree[no]!=OVER){
postorder(no*2,space);
pos[no]=count;
count+=space;
printf("no:%d val:%d pos:%d\n",no,tree[no],pos[no]);
postorder(no*2+1,space);
}
}
int getWidth(int no){
return tree[no]==-1?0:getWidth(2*no)+1+getWidth(2*no+1);
}
int print(int root){
int w=1,no=root,i,j,k,ww;
int sum=w;
int flag=false;
while(true){
int rear=w+no;
int lastp=0;
int havep=1;
int que[maxn]={0};
int qrear=0;
for(;no<rear;no++){
if(tree[no]!=OVER){
que[qrear++]=no;
//打印树根(元素)
if(tree[no*2]!=OVER||tree[no*2+1]!=OVER)
flag=true;
if(tree[no]!=OVER){
for(i=1;i<pos[no]-lastp;i++)
printf(" ");
printf("%d",tree[no]);
lastp=pos[no];
}
}
}
printf("\n");
//打印完一行元素.开始打印树枝
for(i=0;i<qrear;i++){
int pno=que[i];
if(tree[pno*2]!=OVER||tree[pno*2+1]!=OVER){
if(tree[pno*2]!=OVER){
for(;havep<pos[pno*2];havep++)
printf(" ");
for(;havep<pos[pno];havep++)
printf("-");
printf("|");
havep++;
}
if(tree[pno*2+1]!=OVER){
for(;havep<pos[pno];havep++)
printf(" ");
if(tree[pno*2]==OVER){
havep++;
printf("|");
}
for(;havep<=pos[pno*2+1];havep++)
printf("-");
}
}
}
printf("\n");
if(!flag){//某一层没有任何一个元素有孩子节点,就此停止.
break;
}else{
flag=false;
w*=2;
sum+=w;
}
}
}
int create_full(int n){
int i=0;
n=my_pow(2,n);
init();
for(i=1;i<n;i++)
tree[i]=1;
return 0;
}
int main(){
init();
//create(1);
create_full(5);
postorder(1,5);
printf("\n");
print(1);
return 0;
}