一、实验目的
1、 熟练理解树和二叉树的相关概念,掌握的存储结构和相关操作实现;
2、 掌握树的顺序结构的实现;
3、 学会运用树的知识解决实际问题
二、 实验内容
1、自己确定一个二叉树(树结点类型、数目和结构自定)利用链式存储结构方法存储。实现树的构造,并完成:
1)用前序遍历、中序遍历、后序遍历输出结点数据;
2)以合理的格式,输出各个结点和双亲、孩子结点信息;
3)输出所有的叶子结点信息;
三、算法分析
定义tree类,树结点类型为字符型,定义公有函数:构造、析构、遍历、双亲孩子函数,为避免类的调用者访问tree类的私有变量root,调用相应的私有函数。
空结点用#表示。
四、源代码
#include<iostream>
using namespace std;
struct node
{
char data;
node *lchild,*rchild;
};
class tree
{
public:
tree(){root=Create(root);}
~tree(){Release(root);}
void PreOrder(){PreOrder(root);}
void InOrder(){InOrder(root);}
void PostOrder(){PostOrder(root);}
void parentchild(){parentchild(root,NULL);}
void leaf(){leaf(root);}
private:
node *root;
node *Create(node *bt);
void Release(node *bt);
void PreOrder(node *bt);
void InOrder(node *bt);
void PostOrder(node *bt);
void parentchild(node *bt,node *p);
void leaf(node *bt);
};
node *tree::Create(node *bt)
{
char c;
cin>>c;
if(c=='#') return NULL;
else{
bt=new node;
bt->data=c;
bt->lchild=Create(bt->lchild);
bt->rchild=Create(bt->rchild);
}
return bt;
}
void tree::Release(node *bt)
{
if(bt!=NULL)
{
Release(bt->lchild);
Release(bt->rchild);
delete bt;
}
}
void tree::PreOrder(node *bt)
{
if(bt==NULL)return;
else{
cout<<bt->data<<" ";
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
}
void tree::InOrder(node *bt)
{
if(bt==NULL)return;
else{
InOrder(bt->lchild);
cout<<bt->data<<" ";
InOrder(bt->rchild);
}
}
void tree::PostOrder(node *bt)
{
if(bt==NULL)return;
else{
PostOrder(bt->lchild);
PostOrder(bt->rchild);
cout<<bt->data<<" ";
}
}
void tree::parentchild(node *bt,node *p)
{
if(bt!=NULL)
{
cout<<"结点"<<bt->data<<" ";
if(bt->lchild!=NULL)
cout<<"左孩子"<<bt->lchild->data<<" ";
else
cout<<"没左孩子"<<" ";
if(bt->rchild!=NULL)
cout<<"右孩子"<<bt->rchild->data<<" ";
else
cout<<"没右孩子"<<" ";
if(p!=NULL)
cout<<"双亲"<<p->data;
else cout<<"没双亲";
cout<<endl;
parentchild(bt->lchild,bt);
parentchild(bt->rchild,bt);
}
}
void tree::leaf(node *bt)
{
if(bt!=NULL)
{
if(bt->lchild==NULL&&bt->rchild==NULL)
cout<<bt->data<<" ";
leaf(bt->lchild);
leaf(bt->rchild);
}
}
int main()
{
cout<<"请输入创建一颗二叉树的结点数据:"<<endl;
tree T;
cout<<"前序遍历:"<<endl;
T.PreOrder();
cout<<endl;
cout<<"中序遍历:"<<endl;
T.InOrder();
cout<<endl;
cout<<"后序遍历:"<<endl;
T.PostOrder();
cout<<endl;
char x;
cout<<"叶子为:"<<endl;
T.leaf();
cout<<endl;
T.parentchild();
cout<<endl;
return 0;
}
五、运行结果
六、心得
这次实验对二叉链表有了更深的认识,学会在函数中调用对应的私有函数,主要是找双亲有点困难,在同学的帮助下勉强完成,即在parentchild函数加多一个指向结点双亲的形参。