实验五

一、实验目的

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;  
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值