实验五 树的基本操作
1.实验目的:
熟悉树的基本定义,树的存储方式、建立方法及相关基本操作,能够根据实际情况选择合适的存储结构。
2.实验内容:
以二叉链表作存储结构,试编写前序、中序、后序遍历二叉树的算法。
3.正文部分
①什么是树?
一种非线性结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。这个数据结构的形状看起来像一颗叶子朝下倒挂的树。
- 根节点:没有父节点的结点成为根节点。
- 叶节点:没有子节点的结点称为叶子结点。
②什么是二叉树?
一颗二叉树是结点的一个有限集合,该集合或者为空,或者是一个根节点加上两颗别称为左子树和右子树的二叉树组成
二叉树的特点:
1.每个节点最多有两颗子树,即二叉树不存在大于2的结点。
2.二叉树的子树有左右之分,其子树的次序不能颠倒。
③先序遍历
先访问根节点,然后再访问左子树,最后再访问右子树。
根据题目的要求,我们需要通过动态内存开辟的空间去存储。
根据先序的特点,如果我们的头结点为空的话,那么我们就可以直接返回空。
否则我们就要将该节点的值插入二叉树,再去访问左子树和右子树。
④中序遍历
先访问左子树,然后再访问根节点,最后再访问右子树。
⑤后序遍历
先访问左子树,然后再访问右子树,最后再访问根节点。
#include<iostream>
using namespace std;
struct Node {
char data;//储存数据
Node* L_child;//左孩子
Node* R_child;//右孩子
};
//先序遍历建立二叉链表
void Create_BT(Node*& p)
{
char ch;
cin >> ch;//输入数据
if (ch == '#')
p = NULL;
else {
p = new Node;
p->data = ch;
Create_BT(p->L_child);//左子树递归
Create_BT(p->R_child);//右子树递归
}
}
//先序遍历
void POD(Node* p)
{
if (p != NULL) {
cout << p->data;//访问根节点
POD(p->L_child);//左子树递归遍历
POD(p->R_child);//右子树递归遍历
}
}
//中序遍历
void IOD(Node* p)
{
if (p != NULL) {
IOD(p->L_child);//左子树递归遍历
cout << p->data;//访问根节点
IOD(p->R_child);//右子树递归遍历
}
}
//后序遍历
void PoOD(Node* p)
{
if (p != NULL) {
PoOD(p->L_child);//左子树递归遍历
PoOD(p->R_child);//右子树递归遍历
cout << p->data;//访问根节点
}
}
int main()
{
Node* root;//建立根结点
Create_BT(root);
cout << "先序遍历:";
POD(root);
cout << endl;
cout << "中序遍历:";
IOD(root);
cout << endl;
cout << "后序遍历:";
POD(root);
cout << endl;
return 0;
}