实验5:树和二叉树的实验2
#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();
void message(T x){ message(root,x); }
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 message(BiNode<T> *bt,T x);
void Parent(BiNode<T> *bt,T x);
};
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()
{
front = rear =-1;
if(root == NULL) return;
Q[++rear] = root;
while(front!=rear)
{
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>
BiNode<T> *Bitree<T>::Creat(BiNode<T> *bt)
{
char ch;
cout<<"前序遍历输入扩展二叉树的各个结点数据,输入#为空 :"<<endl;
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>::message(BiNode<T> *bt,T x)
{
int data;
if(bt==NULL) return;
else{
if(bt->data==x)
{
cout<<"结点"<<bt->data<<endl;
if(bt->lchild!=NULL) cout<<"左孩子为:"<<bt->lchild->data<<endl;
else cout<<"无左孩子"<<endl;
if(bt->rchild!=NULL) cout<<"右孩子为:"<<bt->rchild->data<<endl;
else cout<<"无右孩子"<<endl;
if(bt==root) cout<<"该结点为根,无双亲"<<endl;
else Parent(root,x);
}
else{
message(bt->lchild,x);
message(bt->rchild,x);
}
}
}
template<class T>
void Bitree<T>::Parent(BiNode<T> *bt,T x)
{
if(bt==NULL) return;
else
{
if(bt->lchild->data==x||bt->rchild->data==x)
cout<<"双亲为:"<<bt->data<<endl;
else{
Parent(bt->lchild,x);
Parent(bt->rchild,x);
}
}
}
void main()
{
char x; int q;
Bitree<char>s;
cout<<"前序遍历二叉树:"<<endl;
s.Preorder();
cout<<endl;
cout<<"中序遍历二叉树:"<<endl;
s.Inorder();
cout<<endl;
cout<<"后序遍历二叉树:"<<endl;
s.Postorder();
cout<<endl;
cout<<"输出结点信息:"<<endl;
for(int i=0;i=1;i=q)
{
cout<<"请输入需要查询的结点元素"<<endl;
cin>>x;
s.message(x);
cout<<"是否需要继续查询结点元素?"
<<endl<<"是:1 否:0"<<endl;
cin>>q;
if (q==0) break;
}
#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();
void message(T x){ message(root,x); }
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 message(BiNode<T> *bt,T x);
void Parent(BiNode<T> *bt,T x);
};
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()
{
front = rear =-1;
if(root == NULL) return;
Q[++rear] = root;
while(front!=rear)
{
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>
BiNode<T> *Bitree<T>::Creat(BiNode<T> *bt)
{
char ch;
cout<<"前序遍历输入扩展二叉树的各个结点数据,输入#为空 :"<<endl;
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>::message(BiNode<T> *bt,T x)
{
int data;
if(bt==NULL) return;
else{
if(bt->data==x)
{
cout<<"结点"<<bt->data<<endl;
if(bt->lchild!=NULL) cout<<"左孩子为:"<<bt->lchild->data<<endl;
else cout<<"无左孩子"<<endl;
if(bt->rchild!=NULL) cout<<"右孩子为:"<<bt->rchild->data<<endl;
else cout<<"无右孩子"<<endl;
if(bt==root) cout<<"该结点为根,无双亲"<<endl;
else Parent(root,x);
}
else{
message(bt->lchild,x);
message(bt->rchild,x);
}
}
}
template<class T>
void Bitree<T>::Parent(BiNode<T> *bt,T x)
{
if(bt==NULL) return;
else
{
if(bt->lchild->data==x||bt->rchild->data==x)
cout<<"双亲为:"<<bt->data<<endl;
else{
Parent(bt->lchild,x);
Parent(bt->rchild,x);
}
}
}
void main()
{
char x; int q;
Bitree<char>s;
cout<<"前序遍历二叉树:"<<endl;
s.Preorder();
cout<<endl;
cout<<"中序遍历二叉树:"<<endl;
s.Inorder();
cout<<endl;
cout<<"后序遍历二叉树:"<<endl;
s.Postorder();
cout<<endl;
cout<<"输出结点信息:"<<endl;
for(int i=0;i=1;i=q)
{
cout<<"请输入需要查询的结点元素"<<endl;
cin>>x;
s.message(x);
cout<<"是否需要继续查询结点元素?"
<<endl<<"是:1 否:0"<<endl;
cin>>q;
if (q==0) break;
}
}