树的基本实现方法

适用于新手的简单数组实现树

文章目录

一、双亲表示法实现树

除了根节点以外,其余结点不一定有孩子,但一定有双亲!

因此我们可以定义下面这么一个结构体!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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个有梦想的懒人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值