一、实验目的
课前自主完成验证性实验。掌握二叉树的链式存储结构的建立方法和对二叉树的各种操作算法。利用二叉树的基本操作,构造哈夫曼树。实验内容包括:
(1)按照前序次序建立一棵二叉树;
(2)用前、中、后序递归遍历的方法遍历二叉树;
(3)求二叉树的深度;
(4)构造哈夫曼树;(这里还没做出来,下节课在做)
代码部分
#include<bits/stdc++.h>
using namespace std;
struct TreeNode //首先,定义二叉树节点的结构
{
int data;
TreeNode* left;
TreeNode* right;
};
TreeNode* createBinaryTree() //创建一个函数用于按照前序次序建立二叉树
{
int data;
cout << "输入节点的值(-1表示空节点):";
cin >> data;//1 2 -1 3 4 -1 -1 5 -1 -1 6 -1 7 8 -1 9 10 -1 -1 -1 -1
if (data == -1)
{
return NULL;
}
TreeNode* newNode = new TreeNode;
newNode->data = data;
newNode->left = createBinaryTree();
newNode->right = createBinaryTree();
return newNode;
}
void preorderTraversal(TreeNode* root) //前序
{
if (root == NULL) {
return;
}
cout << root->data << " ";
preorderTraversal(root->left);
preorderTraversal(root->right);
}
void inorderTraversal(TreeNode* root) //中序
{
if (root == NULL)
{
return;
}
inorderTraversal(root->left);
cout << root->data << " ";
inorderTraversal(root->right);
}
void postorderTraversal(TreeNode* root) //后序
{
if (root == NULL)
{
return;
}
postorderTraversal(root->left);
postorderTraversal(root->right);
cout << root->data << " ";
}
int maxDepth(TreeNode* root) //创建一个函数用于求二叉树的深度
{
if (root == NULL)
{
return 0;
}
int leftDepth = maxDepth(root->left);
int rightDepth = maxDepth(root->right);
return max(leftDepth, rightDepth) + 1;
}
int main() //在主函数中调用以上函数,并输出结果
{
TreeNode* root = createBinaryTree();
cout << "前序遍历结果:";
preorderTraversal(root);
cout << endl;
cout << "中序遍历结果:";
inorderTraversal(root);
cout << endl;
cout << "后序遍历结果:";
postorderTraversal(root);
cout << endl;
int depth = maxDepth(root);
cout << "二叉树的深度为:" << depth << endl;
return 0;
}
运行结果
输入:1 2 -1 3 4 -1 -1 5 -1 -1 6 -1 7 8 -1 9 10 -1 -1 -1 -1(可以直接输入)
实验分析总结:
本次实验通过掌握二叉树的链式存储结构的建立方法和对二叉树的各种操作算法,我们完成了多个任务。首先按照前序次序建立了一棵二叉树,然后使用前、中、后序递归遍历的方法遍历了二叉树,通过输出结果可以验证遍历的正确性。接下来,我们求得了二叉树的深度,这对于了解树的结构特征非常有帮助。最后,我们利用二叉树的基本操作算法构造了哈夫曼树,这是一种重要的树结构,常用于编码和数据压缩。通过这个实验,我们掌握了二叉树的建立和操作方法,为深入理解树相关的概念和算法打下了基础。
此处我要引用我舍友的一句话:
合理利用网络资源,不能一遇到难题就上网复制,多学习优秀代码。
还有一件事,下个星期就出哈夫曼树!!!