树的存储结构--双亲表示法
#include<stdio.h>#include<stdlib.h>
#define maxsize 20
#include<iostream>
using namespace std;
typedef struct
{
char da
int parent;//双亲位置
}pnode;
typedef struct
{
pnode s[maxsize];
int n; //结点数;
}ptree;
//初始化,也可以不初始化
void inittree(ptree &T)
{
T.n=0;
}
//创建并存储
void create(ptree &T)
{
int i;
cout<<"请输入节点数:";
cin>>T.n;
cout<<"请输入节点基本信息->节点的值,双亲位置(根节点的双亲位置为-1):";
for(i=0;i<T.n;i++)
{
cin>>T.s[i].da
}
}
//查找c的父亲
void reserch(ptree &T,char c)
{
for(int i=0;i<T.n;i++)
{
if(T.s[i].da
{
if(T.s[i].parent>=0)
{
cout<<"其父亲为:";
cout<<T.s[ T.s[i].parent].da
break; //因为父亲只有一个找到后立即结束整个for(int i=0;i<T.n;i++)循环
}
else
{
cout<<"其为根节点所以没有父亲"<<endl;
break;
}
}
else if(T.s[i].da
{
cout<<"该字符不在范围内"<<endl;
}
}
}
//查找c的孩子
void reserch2(ptree &T,char c)
{
for(int i=0;i<T.n;i++)
{
if(T.s[i].da
{
int m=0;//记录孩子的个数
for(int j=0;j<T.n;j++)
{
if(T.s[j].parent==i)
{
m++;
cout<<"其孩子为:";
cout<<T.s[j].da
} //可能有多个孩子所以找到一个孩子后没有结束整个for(int j=0;j<T.n;j++)循环;
else if(T.s[j].parent!=i&&j>=T.n-1&&m==0) //确定其为叶子;因为如果没有m=0,即便查找的字符不是叶子而整个数组最后一个字符即使
{ //不是其孩子也满足T.s[j].parent!=i&&j>=T.n-1,也会输出语句"其为叶子所以没有孩子";
cout<<"其为叶子所以没有孩子"<<endl;
}
}
break; //找到c并且找到了的孩子后结束整个for(int i=0;i<T.n;i++)循环;因为数组中仅且只有一个字符c
}
else if(T.s[i].da
{
cout<<"该字符不在范围内"<<endl;
}
}
}
//打印
void print(ptree &T)
{
for(int i=0;i<T.n;i++)
cout<<T.s[i].da
}
void main()
{
char c;
ptree T;
create(T);
cout<<"您刚才输入的基本信息为:"<<endl;
print(T);
cout<<"请输入要查找父亲的字符:"<<endl;
while((cin>>c&&c!='n')) //当输入的字符为n时结束循环
{
reserch(T,c);
cout<<"请输入要查找孩子的字符:"<<endl;
cin>>c;
reserch2(T,c);
cout<<"请输入要查找父亲的字符:"<<endl;
}
}