树和森林

树的存储结构

一 双亲表示法

使用一维数组,每一个元素有两个域,数据域和父结点索引域node

数据结构定义:

#define	size	10
typedef	struct
{
  char data;
  int	parent;
} Node;
Node slist[size];

图示:

image-20200610094753525

特色:

找父结点容易,找结点 的孩子麻烦,需遍历整张表。数组

二 孩子链表表示法

使用一维数组存储树中全部节点,每一个元素有两个域数据域和第一个孩子节点的指针域安全

孩子节点也有两个域分别是自身对应的索引域以及下一个孩子节点的指针域数据结构

数据结构定义:

# define MAXND 20
typedef struct bnode
{int child;
    struct bnode *next;
}node,*childlink;
typedef struct
{ 
  char data;  
  childlink hp;
}headnode;
headnode link[MAXND];

图示:

image-20200610100421170

特色:

查找子节点方便,查找父结点困难指针

双亲孩子表示法

为了接查找父结点困难的问题,能够在数组元素中增长一个域存储父结点的索引code

数据结构定义:

# define MAXND 20
typedef struct bnode
{
    int child;
    struct bnode *next;
}node,*childlink;
typedef struct{
    char data;
    int parent; childlink hp;
}headnode;
headnode link[MAXND];

图示:

image-20200610101225384

三 孩子兄弟表示法(二叉链表表示法)

使用链表存储树中的节点,链表中每一个元素有三个域分别为第一个孩子指针域,数据域,下一个兄弟指针域索引

节点组成:class

image-20200610104808018

数据结构定义:

Typedef struct tnode
{
int data;
struct tnode *son,*brother;
}*Tree;

图示:

image-20200610104528702

特色:

  • 数据结构定义与二叉树的二叉链表表示法安全相同,可是指针所表示的含义是不一样的二叉树

  • 查找父结点需遍历链表遍历

树/森林与二叉树之间的转换

通常树转换二叉树

转换方法:

  1. 个兄弟节点之间添加连线
  2. 对任一节点,除最左孩子以外,抹掉该节点与其余子节点的各枝(取消连线)
  3. 以根节点为中心,将连线顺时针转45度

图示:

image-20200610160118557

一棵树的孩子兄弟链表示法与将该树转为二叉树后的二叉链表表示法存储结构彻底相同,仅节点中指针含义不一样

设有如下树(左),并将其转换为二叉树(右):

image-20200610160545060

使用孩子兄弟表示法存储以上树获得存储结构如图(左)

使用二叉链表表示法存储转换后的二叉树获得结构如图(右)

image-20200610161225219

森林转换二叉树

转换方法:

  1. 将每棵树转换为对应的二叉树
  2. 将第一步获得的各二叉树的根节点看做是兄弟节点,加连线,以最左侧根节点做为中心将根节点连线顺时针旋转45度

图示:

image-20200610163705219

二叉树还原为通常树

明确:根节点没有右孩子的二叉树可转为通常树

还原方法:

  1. 从根节点起
  2. 当前节点的左孩子和左孩子右枝上的全部节点做为当前节点的孩子节点
  3. 重复第一步

也是树转二叉树的逆运算即以根节点为中心全部节点逆时针旋转45度

图示:

image-20200610195745932

二叉树还原为森林

明确:根节点有右孩子的二叉树可转为森林

还原方法:

  1. 根节点右枝上的每个节点做为一个的根节点
  2. 将拆开后的二叉树按二叉树还原为通常树的方法转换为通常树

也是森林转二叉树的逆运算

图示:

image-20200610202905880

树的遍历

先序遍历:先访问根节点,而后依次先序遍历根的每一个子树

后序遍历:先依次遍历每棵子树,最后访问根节点

层次遍历:从上到下从左到右依次遍历全部节点

因为子节点个数不肯定因此没有没法实现中序遍历

示例:

image-20200610203816192

上图对应的遍历顺序

先序:ABCDE

后序:BDCEA

层次:ABCED

树的遍历结果与转为二叉树后的遍历结果对应关系

树 => 二叉树

先序 == 先序

后序 == 中序

森林的遍历

先序遍历:依次使用先序遍历森林中每棵树

中序遍历:对每棵树按照先子后根的方式遍历每一个节点

之因此叫中序: 由于 树的后序==树转二叉树的中序

示例:

image-20200610211307262

上图对应的遍历顺序

先序:ABCDEFGHJI

中序:BCDAFEJHIG

相关文章
相关标签/搜索