数据结构——树 | 孩子双亲数组表示法

采取的是顺序存储结构 数组模式

#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*/

N叉树之孩子双亲表示法|数据结构——树|C++实现

猜你喜欢

转载自blog.csdn.net/weixin_46096297/article/details/111702189