数据结构与算法基础(王卓)(21):树的存储结构及其不同表示方法、树和森林跟二叉树的转换

文章详细介绍了树的不同表示方法,包括双亲表示法、孩子表示法、带双亲的孩子链表和孩子兄弟表示法,并提供了个人修改完善的版本。此外,还讨论了树与二叉树之间的转换算法,如将树转换成二叉树和将二叉树转换回树的策略。

目录

 前置条件:

一、

 双亲表示法:(PPT)

 双亲表示法:(个人修改完善版本)

二、

孩子表示法:(PPT)

孩子表示法:(个人修改完善版本)

三、

带双亲的孩子链表:(个人修改完善版本)

四、

孩子兄弟表示法:(个人修改完善版本)

树和森林跟二叉树的转换 

将树转换成二叉树:

将二叉树转换成树

森林变二叉树:

树变二叉根相连:

二叉树变森林:

去掉全部右孩线,孤立二叉再还原(成树)


 前置条件:

#include<iostream>
using namespace std;

typedef int Status;
#define MAXTSIZE 100

typedef char TElemtype;//Tree Elemtype
//根据需求情况修改
typedef TElemtype SqBiTree;//sequence binary tree
//binary:二进制的; 二元的; 由两部分组成的;
SqBiTree bt;//binary tree

struct BiNode//二叉链表存储结构
{
	TElemtype data;
	struct
		BiNode* lchild, * rchild;
	//左右孩子指针
};
typedef BiNode* BiTree;

struct TriNode//trinary:三元的
{
	TElemtype data;
	struct
		BiNode* lchild, * rchild, * parent;
};
typedef TriNode* TriTree;

#define MAX_TREE_SIZE 100

一、


 双亲表示法:(PPT)

struct PTNode
//PT:Parent Tree

{
    TElemType data;
    int parent;  //双亲位置
};
//PTNode;

struct PTree
{
    PTNode nodes[MAX_TREE_SIZE];
    int r;  //根节点位置
    int n;  //结点个数
};

 双亲表示法:(个人修改完善版本)

//双亲表示法
//PT:Parent Tree
struct PTNode//双亲表示法:结点
{
	TElemtype data;
	int SelfNumber;  //自身位置
	int ParentNumber;  //双亲位置
};

struct PTree//双亲表示法:树
{
	PTNode nodes[MAX_TREE_SIZE];
	int r;  //根节点位置
	int n;  //结点个数
};

二、


孩子表示法:(PPT)

//孩子结点结构
//CT:Child Tree
struct CTNode
{
    int child;
    struct CTNode* next;
};
typedef CTNode *ChildPtr;

//双亲结点结构
struct CTBox
{
    TElemType data;
    ChildPtr firstchild;  //孩子链表头指针
};

//树结构
struct CTree
{
    CTBox nodes[MAX_TREE_SIZE];
    int r;  //根节点位置
    int n;  //结点数
};

孩子表示法:(个人修改完善版本)

//孩子表示法
//CT:Child Tree

//后续结点结构 / 孩子结点结构
struct CTNode
//CTNode:Child Tree Node:孩子结点结构
{
	int ChildNumber;
	//通过下标去找后面的整个结点(以及后续来访问后续结点的数据)
	struct CTNode* next;
};
typedef CTNode* ChildPtr;//Pointer


//头结点/双亲结点结构
struct CTBox
{
	TElemtype data;
	int SelfNumber;
	ChildPtr firstchild;  //孩子链表头指针
	//准确地说,是指向第一个后续孩子的整个结点
	//注意:是指向 第一个后续孩子的 整个结点
};

//树结构
struct CTree//只记录(存储)头结点所组成的集合
{
	CTBox nodes[MAX_TREE_SIZE];//头结点所组成的数组
	int r;  //根节点位置
	int n;  //结点数
};

三、


带双亲的孩子链表:(个人修改完善版本)

//带双亲的孩子链表表示法
//CT:Child Tree

//后续结点结构 / 孩子结点结构
struct CTNode
//CTNode:Child Tree Node:孩子结点结构
{
	int ChildNumber;
	//通过下标去找后面的整个结点(以及后续来访问后续结点的数据)
	struct CTNode* next;
};
typedef CTNode* ChildPtr;//Pointer


//头结点/双亲结点结构
struct CTBox
{
	int ParentNumber;  //双亲位置

	TElemtype data;
	int SelfNumber;
	ChildPtr firstchild;  //孩子链表头指针
	//准确地说,是指向第一个后续孩子的整个结点
	//注意:是指向 第一个后续孩子的 整个结点
};

//树结构
struct CTree//只记录(存储)头结点所组成的集合
{
	CTBox nodes[MAX_TREE_SIZE];//头结点所组成的数组
	int r;  //根节点位置
	int n;  //结点数
};

四、


孩子兄弟表示法:(个人修改完善版本)

struct CSNode//孩子兄弟表示法
	//CS:Child Sibling
{
	TElemtype data;
	struct CSNode* firstchild, * nextsibling;
	//sibling:兄弟姐妹
};
typedef CSNode* CSTree;



树和森林跟二叉树的转换 


将树转换成二叉树:

  1. 连兄弟;
  2. 断(删)双亲(关系)【除了最左孩子外】;
  3. 旋转;

将二叉树转换成树

  1. 连双亲;
  2. 断兄弟;
  3. 回正
  1. 左孩右右连双亲
  2. 去掉原来右孩线

森林变二叉树:

树变二叉根相连:

  1. 连兄弟;
  2. 断(删)双亲(关系)【除了最左孩子外】;
  3. 根相连;

二叉树变森林:

去掉全部右孩线,孤立二叉再还原(成树)

还原:

连双亲;断兄弟;回正

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值