目录
前置条件:
#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;
树和森林跟二叉树的转换
将树转换成二叉树:
- 连兄弟;
- 断(删)双亲(关系)【除了最左孩子外】;
- 旋转;
将二叉树转换成树
- 连双亲;
- 断兄弟;
- 回正
- 左孩右右连双亲
- 去掉原来右孩线
森林变二叉树:
树变二叉根相连:
- 连兄弟;
- 断(删)双亲(关系)【除了最左孩子外】;
- 根相连;
二叉树变森林:
去掉全部右孩线,孤立二叉再还原(成树)
还原:
连双亲;断兄弟;回正
文章详细介绍了树的不同表示方法,包括双亲表示法、孩子表示法、带双亲的孩子链表和孩子兄弟表示法,并提供了个人修改完善的版本。此外,还讨论了树与二叉树之间的转换算法,如将树转换成二叉树和将二叉树转换回树的策略。
694

被折叠的 条评论
为什么被折叠?



