实验七 二叉树
- 一、实验目的:
- 二、实验内容:
- 三、实验结果:
- 1,2;
- 3,4,5;
- 6.
- 数组顺序存储的优缺点
- 二叉链表存储的优缺点
一、实验目的:
掌握二叉树的顺序存储结构
掌握二叉树的链式存储结构
二、实验内容:
1.实现用数组形式存储二叉树。
2.把上面这棵树输入到数组里存储,测试。
存储方案:
用数组顺序存储二叉树,树上的元素存放位置在数组中是固定的,如果树的i位置(从0开始按层编号)有元素,就放在数组的i号位置,没有元素,数组对应的位置就空着(为了便于观察,这里放 ‘#’ )。i的左右子树的编号分别为2i+1和2i+2
3.实现二叉树的二叉链表存储
4.实现用先序,中序,后序中的任何一种输出二叉树结点
5.把上面这棵树作为输入数据,测试程序的正确性
6. 比较数组顺序存储和二叉链表存储的优缺点。
存储方案:
链表存储二叉树通常用具有两个指针域的链表作为二叉树的存储结构,每一个结点由数据域Data, 左指针域lchild和右指针域rchild组成,最后还需要一个指针指向根结点。
存储结构
typedef struct BiTNode
{
elem data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
三、实验结果:
每个同学都要记录实验结果(无论对与错),如果程序调试中有什么错误,记录并分析原因,必须另寻时间调试成功。
实验报告:(及时撰写实验报告)
1,2;
运行截图:
代码实现:
#include<iostream>
#include<stdlib.h>
#define N 11 //N = 2*n + 1(n为节点个数)
using namespace std;
typedef char type;
//定于节点结构
typedef struct BiTNode
{
type data;
struct BiTNode* lchild, * rchild;
}BiTNode, *BiTree;
//开辟节点
BiTree BuyNode(type x)
{
BiTree T = new BiTNode;
//BiTree T = (BiTree)malloc(sizeof(BiTNode));
T->data = x;
T->lchild = nullptr;
T->rchild = nullptr;
return T;
}
//手创建一个二叉树
BiTree CreateBiT1()
{
BiTree node1 = BuyNode('1');
BiTree node2 = BuyNode('2');
BiTree node3 = BuyNode('3');
BiTree node4 = BuyNode('4');
BiTree node5 = BuyNode('5');
node1->rchild = node2;
node2->rchild = node3;
node3->rchild = node4;
node4->rchild = node5;
return node1;
}
//将创建的二叉树按照要求存储在数组中并输出
void PreOrder(BiTree T, char arr[], int& i)
{
if (T == nullptr)
{
arr[i++] = '#';
return;
}
arr[i++] = T->data;
PreOrder(T->lchild, arr, i);
PreOrder(T->rchild, arr, i);
}
int main()
{
char arr[N];
int i = 0;
BiTree T = CreateBiT1();
PreOrder(T, arr, i);
for (int i = 0; i < N; i++)
{
cout << arr[i] << " ";
}
return 0;
}
3,4,5;
按照要求输入如下二叉树:(为空处需要输入 ‘#’ 来结束递归)
运行截图:
代码实现:
#include<iostream>
#include<stdlib.h>
#define N 11 //N = 2*n + 1(n为节点个数)
using namespace std;
typedef char type;
//定于节点结构
typedef struct BiTNode
{
type data;
struct BiTNode* lchild, * rchild;
}BiTNode, *BiTree;
//开辟节点
BiTree BuyNode(type x)
{
BiTree T = new BiTNode;
//BiTree T = (BiTree)malloc(sizeof(BiTNode));
T->data = x;
T->lchild = nullptr;
T->rchild = nullptr;
return T;
}
//递归创建二叉树,需要按照要求输入创建
void CreateBiT2(BiTree& T)
{
char x;
cin >> x;
if (x == '#')
return;
T = new BiTNode;
if (T == nullptr) return;
T->data = x;
T->lchild = nullptr;
T->rchild = nullptr;
CreateBiT2(T->lchild);
CreateBiT2(T->rchild);
}
//先序遍历
void PreOrder1(BiTree T)
{
if (T == nullptr)
return;
cout << T->data << " ";
PreOrder1(T->lchild);
PreOrder1(T->rchild);
}
//中序遍历
void InOrder1(BiTree T)
{
if (T == nullptr)
return;
InOrder1(T->lchild);
cout << T->data << " ";
InOrder1(T->rchild);
}
//后序遍历
void PosOrder1(BiTree T)
{
if (T == nullptr)
return;
PosOrder1(T->lchild);
PosOrder1(T->rchild);
cout << T->data << " ";
}
int main()
{
BiTree T;
cout << "需要按照先序遍历输入数据来创建二插树,每个NULL节点输入'#'代替" << endl;
CreateBiT2(T);
cout << "按照先序遍历输出二叉树" << endl;
PreOrder1(T);
cout << endl << "按照中序遍历输出二叉树" << endl;
InOrder1(T);
cout << endl << "按照后序遍历输出二叉树" << endl;
PosOrder1(T);
return 0;
}
6.
数组顺序存储的优缺点
优点:
存储密度大:数组顺序存储的结构使得存储空间利用率高,因为每个元素都紧密地存储在一起,没有额外的空间用于表示元素之间的关系
随机访问速度快:通过下标可以直接访问数组中的任何元素,这使得查找速度非常快。
实现简单:大多数高级编程语言都支持数组,因此实现起来相对简单
缺点:
插入和删除操作效率低:在数组中插入或删除元素时,需要移动大量元素,这会导致效率低下。
空间预分配问题:数组需要预先分配固定大小的存储空间,如果分配过大,会导致空间浪费;如果分配过小,会导致溢出
二叉链表存储的优缺点
优点:
插入和删除操作方便:二叉链表通过指针连接节点,插入和删除操作只需要修改指针,不需要移动大量元素,因此效率较高。
动态分配空间:二叉链表的存储空间是动态分配的,不需要预先分配固定大小的存储空间,可以根据需要动态地增加或减少存储空间。
缺点:
存储密度小:二叉链表中的每个节点除了存储数据外,还需要存储指向子节点的指针,这降低了存储密度。
随机访问效率低:二叉链表不支持随机访问,需要通过遍历找到目标节点,这会导致查找效率较低。
C++