适用于新手的简单数组实现树
文章目录
- 一、双亲表示法实现树
- 二、实现过程
一、双亲表示法实现树
除了根节点以外,其余结点不一定有孩子,但一定有双亲!
因此我们可以定义下面这么一个结构体!data是数据域,parent是指针域,用来存储双亲结点的数组下标.
二、实现过程
1.结点定义
代码如下(示例):
//结点结构
typedef struct PTNode {
TElemType data; //定义树的数据
int parent; //用来记录双亲位置(双亲的数组下标)
}PTNode;
2.树的定义
代码如下(示例):
//树结构
typedef struct {
PTNode nodes[MAX_TREE_SIZE]; //结点数组
int root, node; //记录根的位置和结点数
}PTree;
3.完整代码实现
#define MAX_TREE_SIZE 100
#include<iostream>
using namespace std;
typedef char TElemType;
//结点结构
typedef struct PTNode {
TElemType data; //定义树的数据
int parent; //用来记录双亲位置(双亲的数组下标)
}PTNode;
//树结构
typedef struct {
PTNode nodes[MAX_TREE_SIZE]; //结点数组
int root, node; //记录根的位置和结点数
}PTree;
//初始化根结点
void InitTree(PTree* s, TElemType m)
{
//初始化根结点
s->nodes[0].parent = -1; //根结点没有双亲,规定根的双亲位置为-1
s->nodes[0].data = m; //赋值根结点
s->root = 0; //根的位置
s->node = 1; //结点数,此时只有一个根结点
cout << "初始化成功!" << endl;
}
//添加孩子结点
void AddNode(PTree& s, TElemType m, int p)
{
if (s.node == 0) //检查是否为空树
{
cout << "空树" << endl;
return;
}
else
{
//非空树
s.nodes[s.node].data = m; //赋值新结点
s.nodes[s.node++].parent = p; //给定父节点,结点数+1
cout << "添加结点成功!" << endl;
}
}
//删除孩子结点(只能删除叶,不能直接跳过删除中间或者根结点)
void DeleteNode(PTree& s, TElemType m, int p)
{
int i = s.node;
while (i > 0)
{
i--;
if (s.nodes[i].parent == p && s.nodes[i].data == m)
{
//格式化该结点
s.nodes[i].parent = 0;
s.nodes[i].data = 0;
//移动后面的结点前移
while (i + 1 < s.node)
{
s.nodes[i] = s.nodes[i + 1];
i++;
}
//结点数-1
s.node--;
return; //找到后退出,节省时间
}
}
}
//打印树
void Print_Tree(PTree& s)
{
int i = 0;
while (i < s.node)
{
cout << "数据:" << s.nodes[i].data
<< " " << "双亲结点位置:"
<< s.nodes[i].parent <<endl;
i++;
}
}
int main()
{
PTree s;
InitTree(&s, 'A');
AddNode(s, 'B', 0);
AddNode(s, 'C', 0);
Print_Tree(s);
DeleteNode(s, 'B', 0);
Print_Tree(s);
return 0;
}