期末考试专用版
//已知考点 二叉树的创建和遍历
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define OK 1
#define ERROR 0
typedef char TElemType;
typedef int Status;
//二叉链表结点类型BiTreeNode、二叉链表类型BiTree
typedef struct BiTNode {
TElemType data;
struct BiTNode *lchild, *rchild;
} BiTreeNode, *BiTree; //注意结点类型名前后是否一致
BiTree T;
int count0 = 0; //全局变量
//--------------------------相关操作--------------------------------
//1.创建二叉树
void CreateBiTree(BiTree &T) {
char ch;
scanf("%c", &ch);
if (ch == '#') T = NULL;
else {
T = (BiTree)malloc(sizeof(BiTreeNode)); //申请结点空间
if (T == NULL) exit(OVERFLOW); //exit为C++的退出函数,声明于stdlib.h中;OVERFLOW为math.h中的一个宏定义,其值为3。
T->data = ch; //存放数据
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
/*2.先序遍历 根左右*/
void PreOrderTraverse(BiTree T) {
if (T == NULL) return ;
printf("%c ", T->data); //访问根节点(打印根结点的值)
PreOrderTraverse(T->lchild);//先序遍历根节点的左子树
PreOrderTraverse(T->rchild);//先序遍历根节点的右子树
}
/*3.中序遍历 左根右*/
void InOrderTraverse(BiTree T) {
if (T == NULL) {
return ;
}
InOrderTraverse(T->lchild);//中序遍历根节点的左子树
printf("%c ", T->data); //访问根节点(打印根结点的值)
InOrderTraverse(T->rchild);//中序遍历根节点的右子树
}
/*4.后序遍历 左右根*/
void TailOrderTraverse(BiTree T) {
if (T == NULL) {
return;
}
TailOrderTraverse(T->lchild);//后序遍历根节点的左子树
TailOrderTraverse(T->rchild);//后序遍历根节点的右子树
printf("%c ", T->data); //访问根节点(打印根结点的值)
}
/*输出叶子结点*/
void PrintLeaf(BiTree T) {
if (T == NULL) return;
if (T->lchild == NULL && T->rchild == NULL ){
printf("%c ", T->data); //访问根节点(打印根结点的值)
count0++;
}
PrintLeaf(T->lchild);//先序遍历根节点的左子树
PrintLeaf(T->rchild);//先序遍历根节点的右子树
}
/* 计算叶子结点总数*/
int LeafCount(BiTree T) {
if (T == NULL) return 0; //如果是空树返回0
if (T->lchild == NULL && T->rchild == NULL ) //如果是叶子结点返回1
return 1;
else return
LeafCount(T->lchild)+LeafCount(T->rchild);
}
/*求二叉树结点个数*/
int NodeCount(BiTree T) {
if (T == NULL) return 0; //如果是空树返回0
else {
int Lnone = NodeCount(T->lchild);
int Rnone = NodeCount(T->rchild);
return Lnone + Rnone + 1;
}
}
/*求二叉树高度*/
int HightCount(BiTree T) {
if (T == NULL) return 0; //如果是空树返回0
else {
int LHight = HightCount(T->lchild); //计算左子树的高度
int RHight = HightCount(T->rchild); //计算右子树的高度
if (LHight > RHight) return LHight + 1;
else return RHight + 1; //返回二者较大者+1
}
}
//主函数
int main() {
BiTree T;
printf("请给二叉树按照先序方式依次输入结点的值(空结点为#):\n");
CreateBiTree(T);
printf("先序方式遍历结果:\n");
PreOrderTraverse(T);
printf("\n");
printf("中序方式遍历结果:\n");
InOrderTraverse(T);
printf("\n");
printf("后序方式遍历结果:\n");
TailOrderTraverse(T);
printf("\n");
printf("度为0的结点有:\n");
PrintLeaf(T);
printf("\n");
printf("二叉树的叶子结点个数:\n");
printf("%d个\n", count0);
printf("二叉树的叶子结点个数:\n");
printf("%d个\n", LeafCount(T));
printf("二叉树的结点总数:\n");
printf("%d个\n", NodeCount(T));
printf("二叉树的高度为:\n");
printf("%d\n", HightCount(T));
return 0;
}