树的表示方法有很多,在董永建老师的一本通里也有介绍,其中一种表示方法为孩子兄弟表示 法,但董老师没给出例程,经本人琢磨,勉强写了一个。
如右图所示一棵,树的建立基本仿照扩展二叉树的原理,建树时,首先输入根值,接着再输入其所有孩子的值,以0结束。(若输入某个节点的所有孩子时,直接输入0,则说明这是一个叶节点,没有孩子)。
根据这一规则,右图所示的树可依次输入1 2 4 0 3 0 0 5 6 0 0 7 0 0。为了检查是否建树成功,顺便写了个先根遍历输出,结果为:1-2-3-4-5-6-7。实现原理:单链表结构。
#include<iostream>
using namespace std;
typedef struct node;
typedef node * tree;
struct node{//孩子兄弟表示法
int n;
tree ch,next;//分别存放第一个孩子,并用链表结构存其兄弟
};
void creat(tree &p)
{
cout<<p->n<<':';//输出根值,方便输入,其后依次输入各个孩子,以0结束
int x;
//开始输入第一个孩子
cin>>x;
if(x)
{
p->ch=new node;
p->ch->n=x,p->ch->next=NULL,p->ch->ch=NULL;
}
else
{
p->ch=NULL;
return;//第一个孩子不存在,就不会有第二个孩子,也不会有孙子
}
//输入第一个孩子的兄弟
tree t=p->ch;
cin>>x;
while(x)
{
t->next=new node;
t->next->n=x;
t=t->next;
t->ch=NULL,t->next=NULL;
cin>>x;
}
//递归每一个孩子的子树
t=p->ch;
while(t)
{
creat(t);
t=t->next;
}
}
void pr(tree p)//前序输出这棵树
{
tree t=p->ch;
while(t)
{
cout<<'-'<<t->n;
pr(t);
t=t->next;
}
}
int main(){
tree p=new node,h;
h=p;
cin>>p->n;
creat(p);
cout<<p->n;
pr(p);
return 0;
}
全树程序
如果树是二叉树,当然程序应该可以更简单一些。(每次都输入左、右儿子的值,如果相应儿子没就输入0,最后不用补0)。样例输入1 2 4 3 0 0 0 5 6 0 0 7 0 0 0。样例输出:1 2 3 4 5 6 7。
#include<iostream>
using namespace std;
typedef struct node;
typedef node *tree;
struct node{
int num;
tree l,r;
};
void bult(tree &p)//引用形参,确保数据同步更改
{
int x,y;
cout<<p->num<<':';
cin>>x>>y;
if(x)
{
p->l=new node;
p->l->num=x;
bult(p->l);
}
else p->l=NULL;
if(y)
{
p->r=new node;
p->r->num=y;
bult(p->r);
}
else p->r=NULL;
}
void pr(node *p)
{
if(p)
{
cout<<p->num<<' ';
pr(p->l);
pr(p->r);
}
}
int main(){
node *h,*p=new node;
h=p;
cin>>p->num;
bult(p);
pr(h);
return 0;
}
二叉树程序
如有写的不妥,请大神指教,不胜感激!