二叉树实验
实验目的:
- 熟练掌握二叉链的存储特点;
- 熟练掌握二叉树的基本操作;
- 熟练掌握基于二叉链的二叉树操作算法实现;
- 能灵活使用二叉树解决具体的问题;
实验内容:
1.定义二叉链的类模板,实现二叉树的基本操作算法;
2.在主函数中定义对象,并调用成员函数,验证二叉链的基本操作。具体包括:
(1)建立二叉链存储的二叉树
(2)遍历二叉树:前序、中序、后序和层序
(3)求二叉树的深度
(4)交换二叉树所有结点的左右子树
(5)统计二叉树叶子结点的个数
(6)前序次序打印二叉树的叶子结点
(7)释放二叉树的存储空间
代码实现:
1.未命名1b.h
#include<iostream>
using namespace std;
template <class T>
struct BiNode
{
T data;
BiNode<T> *lchild, *rchild;
};
template <class T>
class BiTree
{
public:
BiTree( ){root = Creat(root);}
~BiTree( ){Release(root);}
void PreOrder( ){PreOrder(root);}
void InOrder( ){InOrder(root);}
void PostOrder( ){PostOrder(root);}
void LeverOrder( );
int Depth(){Depth(root);}
void CaculateLeafNum(){CaculateLeafNum(root);}
void swap(){swap(root);}
private:
BiNode<T> *root;
BiNode<T> *Creat(BiNode<T> *bt);
void Release(BiNode<T> *bt);
void PreOrder(BiNode<T> *bt);
void InOrder(BiNode<T> *bt);
void PostOrder(BiNode<T> *bt);
int Depth(BiNode<T> *root);
void CaculateLeafNum(BiNode<T>* root);
void swap(BiNode<T> *root);
};
int Leaf_Count = 0;
template <class T>
void BiTree<T>::PreOrder(BiNode<T> *bt)
{
if (bt == NULL) return;
else {
cout << bt->data;
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
}
template <class T>
void BiTree<T> :: InOrder (BiNode<T> *bt)
{
if (bt == NULL) return;
else {
InOrder(bt->lchild);
cout << bt->data;
InOrder(bt->rchild);
}
}
template <class T>
void BiTree<T> :: PostOrder(BiNode<T> *bt)
{
if (bt == NULL) return;
else {
PostOrder(bt->lchild);
PostOrder(bt->rchild);
cout << bt->data;
}
}
template<class T>
void BiTree<T>::LeverOrder()
{
int front,rear;
front=rear=-1; //采用顺序队列,并假定不会发生上溢
BiNode<T> *Q[100];
if (root == NULL) return; //二叉树为空,算法结束
Q[++rear]=root; //根指针入队
while (front != rear) //当队列非空时
{
BiNode<T>* q = Q[++front]; //出队
cout << q->data;
if (q->lchild!=NULL) Q[++rear]=q->lchild;
if (q->rchild!=NULL) Q[++rear]=q->rchild;
}
}
template <class T>
int BiTree<T>::Depth(BiNode<T> *root)
{
int hl,hr;
if (root == NULL) return 0;
else {
hl= Depth(root->lchild);
hr= Depth(root ->rchild);
return max(hl, hr)+1;
}
}
template <class T>
BiNode<T> *BiTree<T>::Creat(BiNode<T> *bt)
{
char ch;
cin >> ch;
if (ch=='#') bt = NULL;
else {
bt = new BiNode<T>;
bt->data = ch;
bt->lchild = Creat(bt->lchild);
bt->rchild = Creat(bt->rchild);
}
return bt;
}
template<class T>
void BiTree<T>::Release(BiNode<T>* bt)
{
if (bt != NULL)
{
Release(bt->lchild);
Release(bt->rchild);
delete bt;
}
}
template<class T>
void BiTree<T>::CaculateLeafNum(BiNode<T> *root) {
if (!root) return;
if (root->lchild == NULL && root->rchild == NULL) Leaf_Count++;
CaculateLeafNum(root->lchild);
CaculateLeafNum(root->rchild);
}
template<class T>
void BiTree<T>::swap(BiNode<T> *root){
BiNode<T> * temp;
if(root == NULL) return;
else{
temp = root->lchild;
root->lchild = root->rchild;
root->rchild = temp;
swap(root->lchild);
swap(root->rchild);
}
}
2.未命名1A.cpp
#include<iostream>
#include"未命名1b.h"
using namespace std;
int main(){
BiTree<char>* bitree=new BiTree<char>();
cout<<"前序遍历";
bitree->PreOrder();
cout << endl;
cout<<"中序遍历";
bitree->InOrder();
cout << endl;
cout<<"后序遍历";
bitree->PostOrder();
cout << endl;
cout<<"层序遍历";
bitree->LeverOrder();
cout << endl;
cout<<"深度:"<<bitree->Depth()<<endl;
bitree->CaculateLeafNum();
cout<<"叶子结点个数:"<<Leaf_Count<<endl;
bitree->swap();
cout<<"左右子树交换后的层序:";
bitree->LeverOrder();
return 0;
}