使用一维数组,每一个元素有两个域,数据域和父结点索引域node
#define size 10 typedef struct { char data; int parent; } Node; Node slist[size];
找父结点容易,找结点 的孩子麻烦,需遍历整张表。数组
使用一维数组存储树中全部节点,每一个元素有两个域数据域和第一个孩子节点的指针域安全
孩子节点也有两个域分别是自身对应的索引域以及下一个孩子节点的指针域数据结构
# define MAXND 20 typedef struct bnode {int child; struct bnode *next; }node,*childlink; typedef struct { char data; childlink hp; }headnode; headnode link[MAXND];
查找子节点方便,查找父结点困难指针
为了接查找父结点困难的问题,能够在数组元素中增长一个域存储父结点的索引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];
使用链表存储树中的节点,链表中每一个元素有三个域分别为第一个孩子指针域
,数据域
,下一个兄弟指针域
索引
节点组成:class
Typedef struct tnode { int data; struct tnode *son,*brother; }*Tree;
数据结构定义与二叉树的二叉链表表示法安全相同,可是指针所表示的含义是不一样的二叉树
查找父结点需遍历链表遍历
转换方法:
图示:
一棵树的孩子兄弟链表示法与将该树转为二叉树后的二叉链表表示法存储结构彻底相同,仅节点中指针含义不一样
设有如下树(左),并将其转换为二叉树(右):
使用孩子兄弟表示法存储以上树获得存储结构如图(左)
使用二叉链表表示法存储转换后的二叉树获得结构如图(右)
转换方法:
图示:
明确:根节点没有右孩子的二叉树可转为通常树
还原方法:
也是树转二叉树的逆运算即以根节点为中心全部节点逆时针旋转45度
图示:
明确:根节点有右孩子的二叉树可转为森林
还原方法:
二叉树还原为通常树
的方法转换为通常树也是森林转二叉树的逆运算
图示:
先序遍历:先访问根节点,而后依次先序遍历根的每一个子树
后序遍历:先依次遍历每棵子树,最后访问根节点
层次遍历:从上到下从左到右依次遍历全部节点
因为子节点个数不肯定因此没有没法实现中序遍历
示例:
上图对应的遍历顺序
先序:ABCDE
后序:BDCEA
层次:ABCED
树的遍历结果与转为二叉树后的遍历结果对应关系
树 => 二叉树
先序 == 先序
后序 == 中序
先序遍历:依次使用先序遍历森林中每棵树
中序遍历:对每棵树按照先子后根的方式遍历每一个节点
之因此叫中序: 由于 树的后序==树转二叉树的中序
示例:
上图对应的遍历顺序
先序:ABCDEFGHJI
中序:BCDAFEJHIG