【数据结构】6.4 树和森林

目录

树的几种存储结构及其特点

1、双亲表示法

2、孩子链表表示法

 3、孩子兄弟表示法

 6.4.2、森林与二叉树的转换

 1.树到二叉树的转换

2.森林到二叉树的转换

3.二叉树到树或森林的转换

6.4.3、树和森林的遍历


树的几种存储结构及其特点

 

1、双亲表示法

方法:
把节点按层次遍历顺序编号。

按层次遍历顺序把节点存入结构体数组,

结构体数组的两个域一个是数据域,另一个是父节点位置编号。

 C语言的类型描述:

#define maxtreesize 100
typedef struct PTNode
{
    ELem data;//数据域
    int parent;//双亲位置域
}PTNode;

typedef struct
{
    PRNode nodes[maxtreesize];//数组
    int r;//根节点位置
    int n;//结点总数
}PTree;

 

2、孩子链表表示法

方法:
        把节点按层次遍历顺序编号。
        所有的兄弟节点形成一个单链表。
        存储结构由结构体数组和单链表构成。
        结构体数组中有两个域,一个存节点数据,另一个是指向本节点孩子链表的指针。

//孩子链表
typedef struct CTNode
{
    int child;//孩子结点位置
    struct CTNode *next;
}CTNode,*ChildPtr;
//双亲结点
typedef struct
{
    Elem data;//数据域
    ChildPtr firstchild;//孩子链表的头指针
}CTBox;

//树结构
typedef struct
{
    CTBox nodes[maxtreesize];//结点数组
    int r;//根节点
    int n;//总数
}CTree;

 

 3、孩子兄弟表示法

     一个结点或者没有最左边的孩子,或者有一个最左边的孩子,

     同样,一个结点或者没有右兄弟,或者有一个右兄弟。

typedef struct CSNode
{
    Elem data;
    struct CSNode ,*firstchild,*nextsibling;
    //左孩子 右兄弟
}CSNode, *CSTree;

 6.4.2、森林与二叉树的转换

 1.树到二叉树的转换

1.树到二叉树的转换
(1)将所有兄弟结点用线连起来;除第一个孩子外,去掉每个结点与双亲结点的连线。
(2)以根为轴心,将树按顺时针方向旋转45度,就转化成了相应的二叉树。


二叉树与“树转换的二叉树”都可以用二叉链表存储,也就是实际存储结构是相同的,无非是逻辑描述不同。


逻辑描述有何不同?
(1)左链一个指向左孩子,一个指向第一个孩子。
(2)右链一个指向右孩子,一个指向右兄弟
 

2.森林到二叉树的转换


      森林即有若干棵树。
        (1)将每棵树先转换成二叉树;
        (2)从第二棵树开始,每棵树的根结点都看成是其前一棵树的根结点的兄弟。       
 

3.二叉树到树或森林的转换

方法:
(1) 若二叉树中某结点是其双亲结点的左孩子(第一个左孩子/左子树),则该结点的右孩子(某结点的其他子节点),右孩子的右孩子……都与该结点的双亲结点连线;
(2) 去掉右孩子与原双亲结点的连线;
    若是转换成森林,还要将与根相连的右孩子连线去掉。

6.4.3、树和森林的遍历

1、前序遍历转换成二叉树前序遍历的比较  相同

2、后序遍历转换成二叉树中序遍历的比较  相同

3、中序遍历

若树不空,
中遍历树的最左边的孩了;
访问根结点;
依次中序遍历其它孩子;

4、森林的遍历

依次遍历每棵树所得序列就是森林的遍历

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值