目录
二叉树建立与遍历实验报告
系别 | 计算机学院 | 班级 | 学号 | 姓名 | |||||
课程名称 | 数据结构 | 实验日期 | |||||||
实验名称 | 二叉树的建立与遍历算法应用 | 成绩 | |||||||
实验目的: 熟悉掌握二叉链表存储结构及基本算法,并能应用二叉树的基本算法解决与之有关的简单问题,训练和提高结构化程序设计能力及程序调试能力。 | |||||||||
实验条件: 计算机一台,Visual C++6.0或DEV C++ | |||||||||
实验内容:
判断一棵二叉树是否为满二叉树。要求二叉树用二叉链表存储,用先序、中序、后序递归遍历算法的任意两种输出二叉树中所有结点,编写程序判断该树是否为满二叉树。
typedef struct node { int val; // 结点的值 struct node *left; // 左子树指针 struct node *right; // 右子树指针 } TreeNode, *Tree;
#include <stdio.h> #include <stdlib.h> // 定义二叉树的结点结构 typedef struct node { int val; // 结点的值 struct node *left; struct node *right; } TreeNode, *Tree; // 创建一棵二叉树,用先序遍历的方式输入结点的值,用#表示空结点 void createTree(Tree *t) { char x; scanf("%c ", &x); if (x == '#') { *t = NULL; // 空结点 } else { *t = (TreeNode *)malloc(sizeof(TreeNode)); (*t)->val = x - '0'; createTree(&(*t)->left); createTree(&(*t)->right); }
} // 计算二叉树的高度 int height(Tree t) { if (t == NULL) { return 0; } else { int leftHeight = height(t->left); int rightHeight = height(t->right); return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1; } } // 判断一棵二叉树是否为满二叉树 int isFullTree(Tree t) { if (t == NULL) { return 1; // 空树是满二叉树 } else { return isFullTree(t->left) && isFullTree(t->right) && height(t->left) == height(t->right); } } void preorder(Tree t) { if (t != NULL) { printf("%d ", t->val); preorder(t->left); preorder(t->right); } } // 中序遍历二叉树 void inOrder(Tree t) { if (t != NULL) { inOrder(t->left); printf("%d ", t->val); inOrder(t->right); } } // 后序遍历二叉树 void postOrder(Tree t) { if (t != NULL) { postOrder(t->left); postOrder(t->right); printf("%d ", t->val); } } int main() { Tree t; printf("输入二叉树结点,用先序遍历的方式,用#表示空结点:\n"); createTree(&t); // 创建一棵二叉树 printf("先序遍历二叉树:\n"); preorder(t); // 先序遍历二叉树 printf("\n"); printf("中序遍历二叉树:\n"); inOrder(t); // 中序遍历二叉树 printf("\n"); printf("后序遍历二叉树:\n"); postOrder(t); // 后序遍历二叉树 printf("\n"); if (isFullTree(t)) { // 判断是否为满二叉树 printf("是满二叉树\n"); } else { printf("不是满二叉树\n"); } system("pause"); return 0; }
| |||||||||
实验总结: 无 | |||||||||
源码
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树的结点结构
typedef struct node {
int val; // 结点的值
struct node *left;
struct node *right;
} TreeNode, *Tree;
// 创建一棵二叉树,用先序遍历的方式输入结点的值,用#表示空结点
void createTree(Tree *t) {
char x;
scanf("%c ", &x);
if (x == '#') {
*t = NULL; // 空结点
}
else {
*t = (TreeNode *)malloc(sizeof(TreeNode));
(*t)->val = x - '0';
createTree(&(*t)->left);
createTree(&(*t)->right);
}
}
// 计算二叉树的高度
int height(Tree t) {
if (t == NULL) {
return 0;
} else {
int leftHeight = height(t->left);
int rightHeight = height(t->right);
return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;
}
}
// 判断一棵二叉树是否为满二叉树
int isFullTree(Tree t) {
if (t == NULL) {
return 1; // 空树是满二叉树
} else {
return isFullTree(t->left) && isFullTree(t->right) && height(t->left) == height(t->right); }
}
void preorder(Tree t) {
if (t != NULL) {
printf("%d ", t->val);
preorder(t->left);
preorder(t->right);
}
}
// 中序遍历二叉树
void inOrder(Tree t) {
if (t != NULL) {
inOrder(t->left);
printf("%d ", t->val);
inOrder(t->right);
}
}
// 后序遍历二叉树
void postOrder(Tree t) {
if (t != NULL) {
postOrder(t->left);
postOrder(t->right);
printf("%d ", t->val);
}
}
int main() {
Tree t;
printf("输入二叉树结点,用先序遍历的方式,用#表示空结点:\n");
createTree(&t); // 创建一棵二叉树
printf("先序遍历二叉树:\n");
preorder(t); // 先序遍历二叉树
printf("\n");
printf("中序遍历二叉树:\n");
inOrder(t); // 中序遍历二叉树
printf("\n");
printf("后序遍历二叉树:\n");
postOrder(t); // 后序遍历二叉树
printf("\n");
if (isFullTree(t)) { // 判断是否为满二叉树
printf("是满二叉树\n");
} else {
printf("不是满二叉树\n");
}
system("pause");
return 0;
}