一.实验要求
1.建立一棵二叉树
2.计算二叉树的度,高度(深度)和叶子结点的个数。
3.先序,中序,后序遍历二叉树并输出结点。
二.实验步骤
- 创建二叉树,用先序遍历序列创建
- 计算二叉树的度
- 计算二叉树的高度(深度)
- 计算二叉树的叶子结点的个数
- 先序遍历并输出结果
- 中序遍历并输出结果
- 后序遍历并输出结果
三.实验分析
1.Creatbitree先序遍历序列创建二叉树。用getchar读取输入的函数,若字符为*,则置为NULL,若字符不为*,则输入到二叉树中
2.DegreeCount计算二叉树的度。当该节点为根节点时,节点度为2;当该节点为叶子节点时,节点度为0;否则节点度为1
3.PostTreeDepth计算二叉树的高度(深度)。如果是空树,深度为0。
如果不是空树,则分别计算左子树的深度和右子树的深度,两者中的最大者+1就是二叉树的深度
4.LeafCount计算二叉树的叶子结点的个数。如果是空树,叶子结点树个数为0,如果不是空树,叶子结点树等于左子树叶子结点数+右叶子树叶子结点数
5.PreOrder先序遍历。按照根左右的顺序遍历。
6.InOrder中序遍历。按照左根右的顺序遍历。
7.PostOrder后序遍历。按照左右根的顺序遍历。
四.代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
//二叉树的存储实现及应用
//1.键盘输入数据,创建二叉树
//2.计算二叉树的度,高度,叶子结点的个数
//3.按前序,中序,后序遍历二叉树,并输出遍历序列
//创建二叉树结点
typedef struct Node
{
char data;
struct Node* lchild, * rchild;
}Bitnode, * Bitree;
//先序遍历序列创建二叉树
void Creatbitree(Bitree* bt)
{
//读取字符。字符为*,则置为NULL;
// 字符不为空,则输入字符;
char ch = getchar();
if (ch == '.')
{
*bt = NULL;
}
else
{
*bt = (Bitree)malloc(sizeof(Bitnode)); //分配空间
(*bt)->data = ch;
Creatbitree(&(*bt)->lchild);//递归创建左子树
Creatbitree(&(*bt)->rchild);//递归创建右子树
}
}
//计算二叉树的度
int DegreeCount(Bitree bt)
{
//如果二叉树为空,度为0
//如果二叉树不为空,二叉树的度为树中结点的度的最大的一个
if (bt == NULL)
{
return 0;
}
int degree = 0;
int temp = 0;
if ((bt->lchild == NULL) && (bt->rchild == NULL)) // 如果当前节点是叶子节点
{
temp = 1; // 临时度为1
if (temp >= degree) // 如果临时度大于等于树度
{
degree = temp;
}
}
else // 如果当前节点有至少一个孩子
{
temp = 2; // 临时度为2
if (temp >= degree) // 如果临时度大于等于树度
{
degree = temp; // 更新树度
}
}
return degree; // 返回树度
}
//计算二叉树的高度(深度)
int PostTreeDepth(Bitree bt)
{
//如果是空树,深度为0
//如果不是空树,则分别计算左子树的深度和右子树的深度,
//两者中的最大者+1就是二叉树的深度
if (bt == NULL)
{
return 0;
}
else
{
int m = PostTreeDepth(bt->lchild); //递归计算左子树的深度
int n = PostTreeDepth(bt->rchild); //递归计算右子树的深度
int max = m > n ? m : n;
return (max + 1);
}
}
//计算二叉树的叶子结点的个数
int LeafCount(Bitree bt)
{
//如果是空树,叶子结点个数为0
//如果不是空树,叶子结点个数等于左子树叶子结点个数 + 右子树叶子结点个数
if (bt == NULL)
{
return 0;
}
else
{
if (bt->lchild == NULL && bt->rchild == NULL)
{
return 1;
}
else
{
return LeafCount(bt->lchild) + LeafCount(bt->rchild);
}
}
}
//前序遍历,并输出
void PreOrder(Bitree bt)
{
if (bt != NULL)
{
printf("%c", bt->data); //打印结点
PreOrder(bt->lchild); //访问左子树
PreOrder(bt->rchild); //访问右子树
}
}
//中序遍历,并输出
void InOrder(Bitree bt)
{
if (bt != NULL)
{
InOrder(bt->lchild); //访问左子树
printf("%c", bt->data); //打印结点
InOrder(bt->rchild); //访问右子树
}
}
//后序遍历,并输出
void PostOrder(Bitree bt)
{
if (bt != NULL)
{
PostOrder(bt->lchild); //访问左子树
PostOrder(bt->rchild); //访问右子树
printf("%c", bt->data); //打印结点
}
}
void main()
{
Bitree bt;
//先序遍历序列创建二叉树
Creatbitree(&bt);
//计算二叉树的度 (树内各节点的度的最大值)(树结点的度就是结点拥有的子树数)
DegreeCount(bt);
printf("二叉树的度: %d\n", DegreeCount(bt));
//计算二叉树的高度(深度) (树中结点层次的最大值 )
PostTreeDepth(bt);
printf("二叉树的高度为: %d", PostTreeDepth(bt));
//计算二叉树的叶子结点的个数 (叶子结点:终端结点)
LeafCount(bt);
printf("\n二叉树叶子结点的个数为: %d\n", LeafCount(bt));
//前序遍历,并输出
PreOrder(bt);
printf("\n");
//中序遍历,并输出
InOrder(bt);
printf("\n");
//后序遍历,并输出
PostOrder(bt);
printf("\n");
}