数据结构的学习中最最基本的实验之——打印二叉树结构
代码生成效果如下:
(一)需求分析
1.打印二叉树的程序中,输入数据的类型限定为字符型,并且以“回车符”为结束标志。用户默认以中序序列输入字符串,由程序转化为二叉树结构,并以凹入表示法来打印出二叉树。
2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入本程序中规定的运算命令;相应的输入数据和运算结果显示在其后。
3.该程序执行的命令包括:
定义二叉链表的类型、定义二叉链表的结点结构、建立二叉树、遍历二叉树、计算二叉树的深度、打印二叉树以及主函数部分
4.测试数据:
输入:AB D CE F
输出: C
F
E
A
D
B
二叉树抽象数据类型定义
ADT BinaryTree{
数据对象:一个集合D,该集合中的所有元素具有相同的特性
数据关系:
若D为空集则称BinaryTree为空二叉树;若D中仅含有一个数据元素,则R为空集,R={H},H是如下的二元关系:
1.若在D中存在的唯一存在的称为根的数据元素root,它在关系H下没有前驱。
2.除root以外,D中每个节点在关系H下都且仅有一个前驱。
基本操作:
1.Initiate(BiTree):
操作结果:将bt初始化为空二叉树
2.Create(BiTree):
操作结果:创建一棵非空二叉树bt
3.Destory(BiTree):
操作结果:销毁二叉树bt
4.Empty(BiTree):
操作结果:若bt为空则返回true,否则返回false
5.Root(BiTree):
操作结果:求二叉树bt的根节点。若为空二叉树则返回null
6.Parent(BiTree,x):
操作结果:求双亲函数,求二叉树bt中结点x的双亲结点。若结点x是二叉树的根节点或无根节点,则返回null
7.Leftchild(BiTree,x):
操作结果:求左孩子
8.Rughtchild(BiTree,x):
操作结果:求右孩子
9.Traverse(BiTree):
操作结果:遍历操作
10.Clear(bt):
操作结果:清除操作
Createbitree(&T,defination)构造二叉树
Preordertraverse(T)先序遍历
Inordertraverse(T)中序遍历
Postordertraverse(T)后序遍历
本程序主要分为六个模块
1)主程序模块
2) 定义二叉链表存储结构模块
3)建立二叉树模块
4)遍历二叉树模块
5)计算二叉树深度模块
6)打印二叉树模块
其中,模块之间的调用关系如下图:
主程序模块
定义二叉链表存储结构模块
建立二叉树模块
遍历二叉树模块
计算二叉树深度模块
打印二叉树模块
①定义二叉链表的存储结构
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
} BiTNode, *BiTree;
②先序建立二叉树
void CreateBiTree(BiTree *T)
{
char ch;
scanf("%c",&ch);
if (ch==' ')
*T=NULL;
else
{ *T=(BiTree)malloc(s izeof(BiTNode));
(*T)->data=ch;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
}
③RDL遍历二叉树
void RDLTraverse(BiTree T)
{
if (T)
{
RDLTraverse(T->rchild);
printf("%2c",T->data);
RDLTraverse(T->lchild);
}
}
④计算二叉树的深度
int BiTreeDepth(BiTree T)
{
int h1,h2,h;
if (T==NULL)
return 0;
else
{
h1=BiTreeDepth(T->lchild);
h2=BiTreeDepth(T->rchild);
if (h1>h2)
h=h1+1;
else
h=h2+1;
}
return h;
}
⑤打印二叉树
void print(BiTree T,int n)
{
int i;
if(T)
{
print(T->rchild,n+1);
for(i=0;i<n;i++)
{
printf("\t");
}
printf("%2c\n",T->data);
print(T->lchild,n+1);
}
}
⑥主函数
void main()
{
BiTree T;
printf("请按先序输入一棵二叉树(如:AB#D##CE#F###):\n"); CreateBiTree(&T);
printf("\nRDL遍历:"); RDLTraverse(T);
printf("\nDepth=%d",BiTreeDepth(T));
printf("\n");
printf("以RDL输出打印结果:\n");print(T,0);
printf("\n");
}
完整代码+注释(可自取,但未经同意请勿转载)
#include <stdio.h>
#include <stdlib.h>
/*定义二叉链表*/
typedef char TElemType;
/*定义二叉链表的存储结构*/
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
} BiTNode, *BiTree;
/*先序建立二叉树*/
void CreateBiTree(BiTree *T)
{
char ch;
scanf("%c",&ch);
if (ch==' ')
*T=NULL;
else
{ *T=(BiTree)malloc(sizeof(BiTNode));
(*T)->data=ch;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
}
/*RDL遍历二叉树*/
void RDLTraverse(BiTree T)
{
if (T)
{
RDLTraverse(T->rchild);
printf("%2c",T->data);
RDLTraverse(T->lchild);
}
}
/*计算二叉树的深度*/
int BiTreeDepth(BiTree T)
{
int h1,h2,h;
if (T==NULL)
return 0;
else
{
h1=BiTreeDepth(T->lchild);
h2=BiTreeDepth(T->rchild);
if (h1>h2)
h=h1+1;
else
h=h2+1;
}
return h;
}
/*打印二叉树*/
void print(BiTree T,int n)
{
int i;
if(T)
{
print(T->rchild,n+1);
for(i=0;i<n;i++)
{
printf("\t");
}
printf("%2c\n",T->data);
print(T->lchild,n+1);
}
}
void main()
{
BiTree T;
printf("请按先序输入一棵二叉树(如:AB#D##CE#F###):\n");
CreateBiTree(&T);
printf("\nRDL遍历:"); RDLTraverse(T);
printf("\nDepth=%d",BiTreeDepth(T));
printf("\n");
printf("以RDL输出打印结果:\n");print(T,0);
printf("\n");
}
程序编译运行后,根据提示输入各结点信息(一定要按先序输入!)
注意叶子结点都要有,如果没有,须添加一些虚结点,用#代替
打印二叉树到这里就结束啦~如果对你有帮助,记得点赞赞噢~