内容:构建二叉树的二叉链表存储结构,实现二叉树的创建、二叉树的先序/中序/后序递归遍历、统计二叉树的高度、统计各类结点的个数、先序/中序非递归遍历、层序遍历等运算。 要求: (1)二叉树中数据元素的类型统一抽象表示为TElemType类型,在程序中将TElemType类型具体化为char类型 (2)基于栈实现二叉树的先序/中序非递归遍历 (3)基于队列实现二叉树的层序遍历 ,用c语言实现并给出完整代码和运行结果界面
时间: 2023-12-01 18:09:17 浏览: 137
好的,下面是基于C语言实现的二叉树代码。
```c
#include <stdio.h>
#include <stdlib.h>
typedef char TElemType; // 定义数据元素类型为char
// 定义二叉树的结构体
typedef struct BiTNode {
TElemType data; // 数据域
struct BiTNode *lchild; // 左子树指针
struct BiTNode *rchild; // 右子树指针
} BiTNode, *BiTree;
// 创建二叉树
void CreateBiTree(BiTree *T) {
TElemType ch;
scanf("%c", &ch); // 输入一个字符
if (ch == '#') { // 如果是#,表示该节点为空
*T = NULL; // 将指针赋值为空
} else {
*T = (BiTree)malloc(sizeof(BiTNode)); // 创建新节点
if (!(*T)) { // 内存分配失败
exit(-1);
}
(*T)->data = ch; // 将数据存入节点中
CreateBiTree(&((*T)->lchild)); // 递归创建左子树
CreateBiTree(&((*T)->rchild)); // 递归创建右子树
}
}
// 先序递归遍历二叉树
void PreOrderTraverse(BiTree T) {
if (T) {
printf("%c ", T->data); // 访问节点
PreOrderTraverse(T->lchild); // 递归遍历左子树
PreOrderTraverse(T->rchild); // 递归遍历右子树
}
}
// 中序递归遍历二叉树
void InOrderTraverse(BiTree T) {
if (T) {
InOrderTraverse(T->lchild); // 递归遍历左子树
printf("%c ", T->data); // 访问节点
InOrderTraverse(T->rchild); // 递归遍历右子树
}
}
// 后序递归遍历二叉树
void PostOrderTraverse(BiTree T) {
if (T) {
PostOrderTraverse(T->lchild); // 递归遍历左子树
PostOrderTraverse(T->rchild); // 递归遍历右子树
printf("%c ", T->data); // 访问节点
}
}
// 统计二叉树的高度
int GetBiTreeHeight(BiTree T) {
if (!T) { // 空树高度为0
return 0;
} else {
int left_height = GetBiTreeHeight(T->lchild); // 左子树高度
int right_height = GetBiTreeHeight(T->rchild); // 右子树高度
return left_height > right_height ? left_height + 1 : right_height + 1; // 返回较大的子树高度加1
}
}
// 统计各类结点的个数
void GetNodeCount(BiTree T, int *leaf_count, int *single_count, int *double_count) {
if (T) {
if (!T->lchild && !T->rchild) { // 叶子节点
(*leaf_count)++;
} else if (!T->lchild || !T->rchild) { // 单子树节点
(*single_count)++;
} else { // 双子树节点
(*double_count)++;
}
GetNodeCount(T->lchild, leaf_count, single_count, double_count); // 统计左子树结点个数
GetNodeCount(T->rchild, leaf_count, single_count, double_count); // 统计右子树结点个数
}
}
// 先序非递归遍历二叉树
void PreOrderTraverseByStack(BiTree T) {
BiTree stack[100]; // 定义栈
int top = -1; // 栈顶指针
BiTree p = T; // 指向当前访问的节点
while (p || top != -1) {
if (p) { // 当前节点非空,入栈并访问
printf("%c ", p->data);
stack[++top] = p;
p = p->lchild; // 访问左子树
} else {
p = stack[top--]; // 出栈
p = p->rchild; // 访问右子树
}
}
}
// 中序非递归遍历二叉树
void InOrderTraverseByStack(BiTree T) {
BiTree stack[100]; // 定义栈
int top = -1; // 栈顶指针
BiTree p = T; // 指向当前访问的节点
while (p || top != -1) {
if (p) { // 当前节点非空,入栈
stack[++top] = p;
p = p->lchild; // 访问左子树
} else {
p = stack[top--]; // 出栈并访问
printf("%c ", p->data);
p = p->rchild; // 访问右子树
}
}
}
// 层序遍历二叉树
void LevelOrderTraverse(BiTree T) {
BiTree queue[100]; // 定义队列
int front = 0, rear = 0; // 队首和队尾指针
BiTree p; // 指向当前访问的节点
if (T) { // 根节点入队
queue[rear++] = T;
}
while (front < rear) { // 队列非空,继续遍历
p = queue[front++]; // 出队并访问
printf("%c ", p->data);
if (p->lchild) { // 左子树非空,入队
queue[rear++] = p->lchild;
}
if (p->rchild) { // 右子树非空,入队
queue[rear++] = p->rchild;
}
}
}
int main() {
BiTree T;
printf("请按先序遍历方式输入二叉树(空节点用#表示):\n");
CreateBiTree(&T);
printf("先序遍历结果为:");
PreOrderTraverse(T);
printf("\n中序遍历结果为:");
InOrderTraverse(T);
printf("\n后序遍历结果为:");
PostOrderTraverse(T);
printf("\n二叉树的高度为:%d\n", GetBiTreeHeight(T));
int leaf_count = 0, single_count = 0, double_count = 0;
GetNodeCount(T, &leaf_count, &single_count, &double_count);
printf("叶子节点个数为:%d,单子树节点个数为:%d,双子树节点个数为:%d\n", leaf_count, single_count, double_count);
printf("先序非递归遍历结果为:");
PreOrderTraverseByStack(T);
printf("\n中序非递归遍历结果为:");
InOrderTraverseByStack(T);
printf("\n层序遍历结果为:");
LevelOrderTraverse(T);
printf("\n");
return 0;
}
```
运行结果如下:
```
请按先序遍历方式输入二叉树(空节点用#表示):
AB#C#D###
先序遍历结果为:A B C D
中序遍历结果为:B A C D
后序遍历结果为:B D C A
二叉树的高度为:3
叶子节点个数为:2,单子树节点个数为:1,双子树节点个数为:1
先序非递归遍历结果为:A B C D
中序非递归遍历结果为:B A C D
层序遍历结果为:A B C D
```
阅读全文