C语言 二叉树图像打印!
2018-09-15 本文已影响5人
董帅2019
有图有真相
y最近在学习数据结构,前面学的都还还好结构也比较简单,学到二叉树时,思维量明显提高。为了更好的更清晰的研究二叉树,自己决定写个打印二叉树图像的算法。
总体思想是利用层次遍历,每遍历到一个元素就将它打印出来,这样就能从头到尾打印出一颗二叉树。其中难点主要是随着二叉树的深度增加,每个元素间的间距也是在增大的。为了找这个规律,我在excel里做了一个巨大的二叉树,一个格子一个格子数每行的间距,然后总结出来的通式。
主要代码如下
//打印每个元素
void PrintTreeNode(char c,int h,int index){
//基础空格
int blank = 3;
//用于标记是否为每行第一个元素
bool flag = false;
//确定元素所在行
int line = 1;
for(;line<=h;line++){
if(index<=pow(2,line-1)){
if(index == pow(2, line-1)){
flag = true;
}else{
line--;
}
break;
}
}
//每个字母的空格倍数
int itemblank = blank;
for(int i=1;i<h-line+1;i++){
itemblank = itemblank*2+1;
}
//每行开头字母的空格倍数
int headblank = (itemblank-1)/2-1;
if(flag){
//新的一行的回车数
int changelinenum = (itemblank-1)/4;
if(changelinenum < 1){
changelinenum = 1;
}
if(line == 1){
changelinenum = 1;
}
//先回车换行
for(int j=0;j<changelinenum;j++){
printf("\n");
}
//在打印空格到正确的位置
for(int i=0;i<headblank;i++){
printf(" ");
}
//最后打印每行的第一个元素
printf("%c",c);
}else{
//先打印空格到正确的位置
for(int i=0;i<itemblank;i++){
printf(" ");
}
//打印元素
printf("%c",c);
}
}
//h为二叉树的高度
void PrintTree(BiTree T,int h){
printf("\n");
//二叉树元素序号
int index = 0;
LinkQueue Q;
InitQueue(&Q);
//第一个元素先入队
EnQueue(&Q, T);
//总数大于满二叉树最大值则退出循环
while(index < pow(2,h)-1){
BiTNode *node = DeQueue(&Q);
index++;
//将空的子树也入队,这样方便计算
if(node == NULL){
EnQueue(&Q, NULL);
EnQueue(&Q, NULL);
//打印第index个元素
PrintTreeNode(' ',h,index);
}else{
EnQueue(&Q, node->lChild);
EnQueue(&Q, node->rChild);
//打印第index个元素
PrintTreeNode(node->data,h,index);
}
}
printf("\n");
}
希望对大家有帮助