一、实验目的
1、 熟练理解树和二叉树的相关概念,掌握的存储结构和相关操作实现;
2、 掌握树的顺序结构的实现;
3、 学会运用树的知识解决实际问题
二、实验内容
1、 自己确定一个二叉树(树结点类型、数目和结构自定)利用链式存储结构方法存储。实现树的构造,并完成:
1) 用前序遍历、中序遍历、后序遍历输出结点数据;
2) 以合理的格式,输出各个结点和双亲、孩子结点信息;
3) 输出所有的叶子结点信息
#include<iostream>
using namespace std;
template<class T>
struct Binode
{
T data;
Binode<T> *lchild,*rchild,*parent;
};
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 print(Binode<T> *bt);
void creatparent(Binode<T> *bt);
void getleaf(Binode<T> *bt);
public:
Bitree()
{
root=creat(root);root->parent=NULL;
}
~Bitree(){release(root);}
void preorder(){preorder(root);}
void inorder(){inorder(root);}
void postorder(){postorder(root);}
void print(){print(root);}
void creatparent(){creatparent(root);}
void getleaf(){getleaf(root);}
};
template<class T>
Binode<T> *Bitree<T>::creat(Binode<T> *bt)
{
char ch;
cin>>ch;
if(ch=='0') return 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) 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>::print(Binode<T> *bt)
{
if(bt)
{
if(bt->lchild)
{
cout<<bt->data<<"有左孩子"<<bt->lchild->data<<"\t";
}
else {cout<<bt->data<<"无左孩子"<<"\t";}
if(bt->rchild)
{
cout<<bt->data<<"有右孩子"<<bt->rchild->data<<"\t";}
else {cout<<bt->data<<"无右孩子"<<"\t";}
if(bt->parent==NULL)cout<<"该结点为根结点,无双亲\n";
else cout<<bt->data<<"的双亲为"<<bt->parent->data<<endl;
}
else return;
print(bt->lchild);
print(bt->rchild);
}
template<class T>
void Bitree<T>::creatparent(Binode<T> *bt)
{
if(bt)
{if(bt->lchild)
{bt->lchild->parent=bt;}
if(bt->rchild)
{bt->rchild->parent=bt;}
}
else return;
creatparent(bt->lchild);
creatparent(bt->rchild);
}
template<class T>
void Bitree<T>::getleaf(Binode<T> *bt)
{
if(bt)
{
if(bt->lchild==NULL&&bt->rchild==NULL)
cout<<bt->data<<"\t";
getleaf(bt->lchild);
getleaf(bt->rchild);
}
}
int main()
{
cout<<"输入结点信息(前序递归输入) :"<<endl;
Bitree<char> t;
cout<<"递归前序遍历输出为 :"<<endl;
t.preorder();
cout<<endl;
cout<<"递归中序遍历输出为 :"<<endl;
t.inorder();
cout<<endl;
cout<<"递归后序遍历输出为 :"<<endl;
t.postorder();
cout<<endl;
t.creatparent();
t.print();
cout<<"叶子结点为: ";
t.getleaf();
return 0;
}