二叉树
树的一种特殊情况,子树的度最大为2, 同时,要求是有序树。
以下不是一种树:
对于三个节点的二叉树,可以有以下几种形态:
左斜树:
右斜树:
满二叉树:除了叶子结点,所有其他的节点都含有左子树和右子树,所有的叶子结点在同一层。
完全二叉树:如果一个二叉树对应着满二叉树的位置一致,就称为完全二叉树
以下均不是完全二叉树:
二叉树的性质:
二叉树的顺序存储结构
对于完全二叉树是非常简便的:
对于非完全二叉树:
二叉树的链式存储结构
data为数据域,lchild是左子树指针,rchild是右子树指针。
二叉树的遍历
1. 先序遍历
先遍历根节点,再先序遍历左子树,最后先序遍历右子树。
次序是:A-B-D-G-H-C-E-I-F
2. 中序遍历
先遍历左子树,然后是根节点,最后是右子树
次序是:G-D-H-B-A-E-I-C-F
3. 后序遍历
先左子树,再右子树,最后根节点。
次序是:G-H-D-B-I-E-F-C-A
4. 层序遍历
从上到下,从左到右,逐层遍历。
次序是:A-B-C-D-E-F-G-H-I
二叉树的建立
使用扩展二叉树表示原有的二叉树:
树转换成二叉树
1. 将所有的兄弟节点之间连线
2. 对每个节点,只保留与第一个孩子节点的连线,删除与其他孩子节点的连线。
3. 顺时针转动,使得结构分明。
森林转二叉树
1. 将各个树转成二叉树。
2. 将第二个树以后的树依次作为前一个树的右子树连接。
二叉树转树
1. 将父节点与子节点的右节点相连。
2. 去除节点与右节点的连线。
3.调整结构。
二叉树转森林
1. 将节点与右孩子的连线擦除
2. 将分离后的二叉树转换成树。
树的遍历
先根遍历:先访问树的根节点,再依次先根遍历每个子树。
后根遍历:依次后根遍历每个子树,再遍历根节点。
先根遍历:A-B-E-F-C-D-G
后根遍历:E-F-B-C-G-D-A
森林的遍历
先根遍历:对于每棵树,先根遍历。(等价于二叉树的先序遍历)
后根遍历:对于每棵树,后根遍历。(等价于二叉树的中序遍历)
先根遍历:A-B-C-D-E-F-G-H-J-I
后根遍历:B-C-D-A-F-E-J-H-I-G
附:二叉树既可以转树,又可以转森林,什么时候可以转森林呢?二叉树的根节点有右孩子,那就是森林,没有那就是树。