前言
这是我做的一个跟二叉树有关的数据结构实验
一、内容
设二叉树采用二叉链表存储结构,结点数据域为字符类型。编写控制台应用程序采用先序遍历法建立二叉树存储结构并实现二叉树的字符图形显示。
二、输入和输出示例
三.实现
代码如下:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
typedef struct BiTree* BiT;
typedef struct BiTree{
char n;
BiT lchild;
BiT rchild;
}BiTree;
//先序遍历创建二叉树
BiT InitBiTree(){
char ch;
BiT bt;
scanf("%c", &ch);
if (ch == '#') return NULL;
bt = (BiT)malloc(sizeof(BiTree));
bt->n = ch;
bt->lchild = InitBiTree();
bt->rchild = InitBiTree();
return bt;
}
//将二叉树按照双亲结点与左右儿子的编号关系将所有结点存入一个一维数组中
void Preorderl(BiT bt,char s[],int k){
if(bt){
s[k]=bt->n;
Preorderl(bt->lchild,s,2*k+1);
Preorderl(bt->rchild,s,2*k+2);
}
}
//树高
int Height(BiT bt){
if(!bt) return 0;
int hl=Height(bt->lchild);
int hr=Height(bt->rchild);
if(hl>hr) return hl+1;
else return hr+1;
}
//销毁树
void DeleteBiT(BiT bt){
if (bt) {
DeleteBiT(bt->lchild);
DeleteBiT(bt->rchild);
free(bt);
}
}
//输出二叉树形
void PrintBiTree(int depth,char s[]) {
int i,j,k,n=0;
if(depth){
for (j = 0; j < depth; j++) {
int w = 1 << (depth - j);
/* if (j == 0)
printf("%*c\n", w-2, ' '); */
if(j!=0) {
int m=n;//记录当前结点数据的下标
//输出每一层的树枝,每循环一次输出两个结点的树枝
for (i = 0; i < 1 << (j - 1); i++) {
if(i==0&&j+1!=depth)
//%*c 表示输出w-2个宽度的数据,即 w-2 处为空格
printf("%*c", w - 2, ' ');
//判断当前结点和下一节点是否为空,即是否为 #
if(s[n]!='#'&&s[n+1]!='#'){
for (k = 0; k < w; k++) printf("_");
printf("|");
for (k = 0; k < w; k++) printf("_");
n+=2;
}
else if(s[n]!='#'&&s[n+1]=='#'){
for (k = 0; k < w; k++) printf("_");
printf("|");
for (k = 0; k < w; k++) printf(" ");
n+=2;
}
else if(s[n]=='#'&&s[n+1]!='#'){
for (k = 0; k < w; k++) printf(" ");
printf("|");
for (k = 0; k < w; k++) printf("_");
n+=2;
}
else{
for (k = 0; k < w; k++) printf(" ");
printf(" ");
for (k = 0; k < w; k++) printf(" ");
n+=2;
}
printf("%*c", w * 2 - 1, ' ');
}
n=m;
printf("\n");
for (i = 0; i < 1 << j; i++,n++){
if(s[n]=='#')
printf("%*c%*c", w - 1, ' ', w + 1, ' ');
else
printf("%*c%*c", w - 1, '|', w + 1, ' ');
}
n=m;
printf("\n");
}
//输出每层的结点数据
for (i = 0; i < 1 << j; i++,n++){
if(s[n]=='#')
printf("%*c%*c", w - 1, ' ', w + 1, ' ');
else
printf("%*c%*c", w - 1, s[n], w + 1, ' ');
}
printf("\n");
}
}
else printf("空树!");
}
int main(){
BiT bt=InitBiTree();
int h,j,k=0;
h=Height(bt);
j=pow(2,h);
char s[j];
//初始化一维数组为 # ,表示没有结点数据
for(int i=0;i<j;i++) s[i]='#';
Preorderl(bt,s,k);
printf("二叉树为:\n");
PrintBiTree(h,s);
DeleteBiT(bt);
return 0;
}
样例:
总结
我写这个主要是为了记录,如果有什么错误的地方,欢迎指出。