二叉树的定义
二叉树或为空树;或是由一个根结点加上两棵分别称为左子树和右子树的、互不交的二叉树组成。
满二叉树
指的是深度为k且含有2^k - 1个结点的二叉树。
完全二叉树
树中所含的 n 个结点和满二叉树中编号为 1 至 n 的结点一一对应。
二叉树的性质
- 在二叉树的第 i 层上至多有xi-1 个结点。(i≥1)
- 深度为 k 的二叉树上至多含 2k-1 个结点(k≥1)
- 对任何一棵二叉树,若它含有n0 个叶子结点、n2 个度为 2 的结点,则必存在关系式:n0 = n2+1
- 具有 n 个结点的完全二叉树的深度为⌊log2n⌋+1 (假设根结点的层次为1)
- 若对含 n 个结点的完全二叉树从上到下且从左至右进行 1 至 n 的编号,则对完全二叉树中任意一个编号为 i 的结点:
(1) 若 i=1,则该结点是二叉树的根,无双亲,否则,编号为⌊i/2⌋ 的结点为其双亲结点。
(2)若 2i>n,则该结点无左孩子, 否则,编号为 2i 的结点为其左孩子结点。若 2i+1>n,则该结点无右孩子结点,否则,编号为2i+1 的结点为其右孩子结点。
二叉树的存储结构
顺序存储结构
顺序存储是用一组连续的存储单元存放数据,顺序存储要求数据是线性结构。二叉树是非线性结构,如何把二叉树转换为线性结构,而且保持结点之间的父/子关系?
满二叉树:从上到下,从左往右依次编号
一般的二叉树:想象成一个完全二叉树
链式存储结构
二叉链表
三叉链表
二叉树的遍历
- 定义:顺着某一条搜索路径巡访二叉树中的结点,使得每个结点均被访问一次,而且仅被访问一次。
- 作用: 遍历的目的是线性化,使二叉树中的结点能够按照某种次序排列在一个线性队列上,便于处理。
线性结构的遍历,因为每个结点均只有一个后继,所以只有一条搜索路径。二叉树是非线性结构,每个结点有两个后继,则存在如何遍历即按什么样的搜索路径进行遍历的问题。二叉树存在下述三条搜索路径:
- 先上后下的按层次遍历;
- 先左(子树)后右(子树)的遍历;
- 先右(子树)后左(子树)的遍历。
遍历方法参考:https://blog.youkuaiyun.com/ifwinds/article/details/83661676 树的遍历一节
森林和二叉树的关系
- 树与二叉树的对应关系:给定一棵树,通过树的二叉链表表示法可以找到唯一的一棵二叉树与之对应。树的二叉链表的右子树一定是空的。
- 森林与二叉树的对应关系:将森林中的第二棵树看成第一棵树的兄弟即可。
森林转换成二叉树
- 转换规则
若 F = Φ,则 B = Φ,否则,
由 ROOT( T1 ) 对应得到Node(root);
由 (t11, t12, …, t1m ) 对应得到 LBT;
由 (T2, T3,…, Tn ) 对应得到 RBT。
森林转换成二叉树示例
-
先将森林中的所有树转换成二叉树
-
以第一棵二叉树的根为树根,将森林中所有的二叉树转换成一棵二叉树
二叉树转换成森林
- 转换规则
若 B = Φ, 则 F = Φ,否则,
由 Node(root) 对应得到 ROOT( T1 );
由LBT 对应得到 ( t11, t12, …,t1m);
由RBT 对应得到 (T2, T3, …, Tn)。 - 转换步骤
1)抹线:将二叉树中根结点与其右孩子连线,及沿右分支搜索到的所有右孩子间连线全部抹掉,使之变成孤立的二叉树
2)还原:将孤立的二叉树还原成树
二叉树转换成森林示例
-
断开二叉树中右分支中搜索到的所有右孩子间的连线
-
将得到的二叉树全部还原成树
由树、森林和二叉树的相互转换可知,树和森林的各种操作均可与二叉树的各种操作相对应。不过,和树对应的二叉树,其左、右子树的概念已改变为: 左子树是孩子,右子树是兄弟。
树、森林和二叉树遍历的关系
树 | 森林 | 二叉树 |
---|---|---|
先根遍历 | 先序遍历 | 先序遍历 |
后根遍历 | 中序遍历 | 中序遍历 |
树的遍历
- 树的先根遍历:A B E F C D G,因此,树的先根遍历结果与其对应二叉树标示的先序遍历结果相同
- 树的后根遍历:E F B C G D A,因此,树的后根遍历结果与其对应二叉树标示的中序遍历结果相同
森林的遍历
-
森林的先序遍历:
若森林不空,则,
1)访问森林中第一棵树的根结点;
2)先序遍历森林中第一棵树的子树森林;
3)先序遍历森林中(除第一棵树之外)其余树构成的森林。
即:依次从左至右对森林中的每一棵树进行先根遍历。
下图,森林的先序遍历结果为 A B C D E F G H I K J,因此,森林的先序遍历结果与其对应二叉树标示的先序遍历结果相同 -
森林的中序遍历
森林不空,则
1)中序遍历森林中第一棵树的子树森林;
2)访问森林中第一棵树的根结点;
3)中序遍历森林中(除第一棵树之外)其余树构成的森林。
即:依次从左至右对森林中的每一棵树进行后根遍历。
下图,森林的中序遍历结果为 B C E D A G F K I J H,因此,森林的中序遍历结果与其对应二叉树标示的中序遍历结果相同