采取的是顺序存储结构 数组模式
#include<iostream>
using namespace std;
#define MAXTREE 25 //定义树的最大结点数
//#define NULL 0
typedef char element;
typedef int Status;
//孩子双亲数组表示法
typedef struct TreeData
{
int parent; //定义每个结点双亲所在位置的下标
element data; //每个结点存放的数据
}TreeData;
typedef struct PTree
{
TreeData data[MAXTREE]; //树的结点数组 用TreeData 定义 所以这个数组的结构里有parent 和 data
int r; //根结点的下标
int n; //当前树中结点的数目
}PTree;
//构造空树——初始化未定
//构造树
Status GreatTree(PTree &tree)
{
cout << "输入双亲表示法中树根的位置" << endl;//先输入树根所在位置 一般为-1 也有为0的
cin >> tree.r;
cout << "输入双亲表示法中树结点个数" << endl;//
cin >> tree.n;
cout << "输入双亲表示法中树结点结构" << endl;
for (int i = 0; i<tree.n; i++)
{
cin >> tree.data[i].data >> tree.data[i].parent;//按照顺序输入内容data和其双亲位置
}
cout << "index" << "\t" << "data" << "\t" << "parent" << endl;//输出界面规范化
for (int i = 0; i<tree.n; i++)
{
cout << i << "\t" << tree.data[i].data << "\t" << tree.data[i].parent << "\t" << endl;
}
return 0;
}
//清空树
Status ClearTree(PTree &tree)
{
int i;
if (tree.n >= 0) {
for (i = 0; i <= tree.n; i++)
{
tree.data[i].data =' ';
}
cout << "树清空" << endl;
}
else
{
cout << "树原本不存在" << endl;
}
return 0;
}
//若数为空树返回提示,否则按普通双亲输出树
Status OutputTree(PTree &tree)
{
int i;
if (tree.n > 0)
{
for (i = 0; i <tree.n; i++)
{
cout <<"树存在,其结构为: "<<endl<< tree.data[i].data << '\t'<<tree.data[i].parent << endl;
}
}
else
{
cout << "这树不存在,无法返回树的内容" << endl;
}
return 0;
}
//求树的深度 本例根节点位置为0 根节点层数为1 所以层数比深度高度多1
Status DepthTree(PTree &tree)
{
int i;
}
int main()
{
PTree tree,bigtree,smalltree;
//生成树
GreatTree(tree);
int c;
cout << "是否需要清空树,如是请输入0,不销毁请输入1" << endl;
cin >> c;
if (c == 0)
ClearTree(tree);
else
return 1;
cout << "再次生成一棵树:bigtree" << endl;
GreatTree(bigtree);
cout << "输出一棵树:tree" << endl;
OutputTree(tree);
cout << "输出一棵树:bigtree" << endl;
OutputTree(bigtree);
//返回树的深度 若结点是非根结点并返回其双亲,否则是根结点其结果为空 若结点是非叶子结点,返回左孩子 若结点有右兄弟,返回其右兄第 插入一颗树 删除一棵树
return 0;
}
/*A -1
B 0
C 1
D 2
E 2
F 1
G 0
H 6
I 0
J 8
K 8
L 8
O 9
P 9
M 9
N 9*/