一、实验目的
1、 熟练理解树和二叉树的相关概念,掌握的存储结构和相关操作实现;
2、 掌握树的顺序结构的实现;
3、 学会运用树的知识解决实际问题
二、实验内容
1、自己确定一个二叉树(树结点类型、数目和结构自定)利用链式存储结构方法存储。实
现树的构造,并完成:
1) 用前序遍历、中序遍历、后序遍历输出结点数据;
2) 以合理的格式,输出各个结点和双亲、孩子结点信息;
3)输出所有叶子的信息。
源代码如下:
#include <iostream>
using namespace std;
template <class T>
struct BiNode
{
T data;
BiNode<T> *lchild;
BiNode<T> *rchild;
};
template <class T>
class BiTree
{
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);//调用后序遍历
void FindChild(BiNode<T> *bt);//查找孩子
void FindParent(BiNode<T> *bt);//查找双亲
void FindLeaf(BiNode<T> *bt);//查找叶子
public:
BiTree() { root = Creat(root); }//构造函数
~BiTree() { Release(root); }//析构函数
void PreOrder(){PreOrder(root);}//前序遍历
void InOrder(){InOrder(root);}//中序遍历
void PostOrder() { PostOrder(root); }//后序遍历
void FindChild(){FindChild(root);}//查找孩子
void FindParent(){FindParent(root);}//查找双亲
void FindLeaf(){FindLeaf(root);}//查找叶子
};
template <class T>
BiNode<T> * BiTree<T>::Creat(BiNode<T> *bt)//构造函数
{
T 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>::PreOrder(BiNode<T> *bt)//前序遍历
{
if (bt != NULL)
{
cout << bt->data << ' ';
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
}
template <class T>
void BiTree<T>::InOrder(BiNode<T> *bt) //中序遍历
{
if (bt != NULL)
{
InOrder(bt->lchild);
cout << bt->data << ' ';
InOrder(bt->rchild);
}
}
template <class T>
void BiTree<T>::PostOrder(BiNode<T> *bt)//后序遍历
{
if (bt != NULL)
{
PostOrder(bt->lchild);
PostOrder(bt->rchild);
cout << bt->data << ' ';
}
}
template <class T>
void BiTree<T>::FindChild(BiNode<T> *bt)//查找孩子
{
if (bt != NULL)
{
if (bt->lchild!=NULL)
cout << bt->data <<"左孩子"<<bt->lchild->data<<endl;
else
cout << bt->data <<"无左孩子"<<endl;
if (bt->rchild!=NULL)
cout << bt->data<<"右孩子"<<bt->rchild->data<<endl;
else
cout << bt->data <<"无右孩子"<<endl;
FindChild(bt->lchild);
FindChild(bt->rchild);
}
}
template <class T>
void BiTree<T>::FindParent(BiNode<T> *bt)//查找双亲
{
if (bt != NULL)
{
if (bt==root)
cout<<bt->data<<"为根结点"<<endl;
if (bt->lchild!=NULL)
cout <<bt->lchild->data<<"双亲为"<< bt->data <<endl;
if (bt->rchild!=NULL)
cout <<bt->rchild->data <<"双亲为"<<bt->data<<endl;
FindParent(bt->lchild);
FindParent(bt->rchild);
}
}
template <class T>
void BiTree<T>::FindLeaf(BiNode<T> *bt)//查找叶子
{
if (bt != NULL)
{
if (bt->lchild==NULL&&bt->rchild==NULL)
cout<< bt->data <<' ';
FindLeaf(bt->lchild);
FindLeaf(bt->rchild);
}
}
int main()
{
cout<<"请输入二叉树:"<<endl;
BiTree<char> B;
cout<<"前序遍历:"<<endl;
B.PreOrder();
cout << endl;
cout<<"中序遍历:"<<endl;
B.InOrder();
cout << endl;
cout<<"后序遍历:"<<endl;
B.PostOrder();
cout << endl;
cout<<"找孩子结点:"<<endl;
B.FindChild();
cout << endl;
cout<<"找双亲结点:"<<endl;
B.FindParent();
cout << endl;
cout<<"找叶子结点:"<<endl;
B.FindLeaf();
cout << endl;
return 0;
}