#include<iostream>
using namespace std;
const int maxSize = 30;
struct Node
{
char data; //数据
int parent; //双亲指针
};
struct PTree
{
Node tNode[maxSize];
int n;
};
int getFirstChild(PTree &T,int i)
{//设各结点在双亲数组中按层次次序排列,算法寻找结点i的第一个子女。若结点i有子女,则
//函数返回第一个子女的位置;若无子女,返回-1
int j;
for(j = i + 1; j < T.n; j++)
{
if(T.tNode[j].parent == i)
{
break;
}
}
if(j < T.n) return j;
else return -1;
}
int getNextSibling(PTree &T,int j) //从j开始找下一个兄弟结点
{//假设结点按层次次序排列,若有则返回其位置,无则返回-1,兄弟可不连续
for(int k = j + 1; k < T.n; k++)
{
if(T.tNode[k].parent == T.tNode[j].parent) return k; //找下一个兄弟结点
}
return -1; //没找到返回-1
}
int getParent(PTree &T,int i)
{//若结点i有双亲返回其双亲结点的位置,否则返回-1
if(i < T.n && i > 0) return T.tNode[i].parent;
else return -1;
}
void createPTree(PTree& PT,char a[][2],int n)
{//在数组a中读入一批分支,建立树的双亲表示,要求各分支在a中按层次次序排列
//算法执行结果,在T的双亲数组中结点按层次次序排列,根在0号位置
PT.tNode[0].data = a[0][0]; PT.tNode[0].parent = -1; //根
int parentStart = 0; //s表示下次找双亲的位置
int parentEnd = 0; //表示当前已有结点数的范围
int cnt = 1; //表示当前加根结点共有多少个结点
for(int i = 0; i < n; i++) //读入各分支
{
for(int j = parentStart;j <= parentEnd; j++)
{
if(PT.tNode[j].data == a[i][0]) //找到双亲
{
PT.tNode[cnt].data = a[i][1]; PT.tNode[cnt].parent = j; //安放子女
if(j != parentStart) //计算下次检查范围,如果j自增过,
{ // 则说明上一个双亲没有子女了
parentStart = j;
}
parentEnd = cnt; //最后一个有可能是双亲的下标位置
cnt++;
break;
}
}
}
PT.n = cnt;
}
int main()
{
char a[maxSize][2] ={{'R','A'},{'R','B'},{'R','C'},{'A','D'},{'A','E'},{'C','F'}
,{'F','G'},{'F','H'},{'F','K'}};
PTree T;
int n = 9;
createPTree(T,a,n);
for(int i = 0; i < T.n; i++)
{
cout<<T.tNode[i].data<<"("<<T.tNode[i].parent<<")"<<endl;
}
cout<<endl;
int k = 6;
cout<<k<<"的双亲是:"<<getParent(T,k)<<endl;
cout<<k<<"的第一个子女是:"<<getFirstChild(T,k)<<endl;
cout<<k<<"的下一个兄弟是:"<<getNextSibling(T,k)<<endl;
return 0;
}
树的表示(1)--双亲表示法
最新推荐文章于 2022-05-19 08:23:13 发布