二叉树
认识二叉树
二叉树的由来
-
树的普通表示方式
-
树的儿子 — 兄弟表示法(每个节点只记录一个子节点和一个兄弟节点)
-
将儿子 — 兄弟表示法旋转,可以得到一个以 A 为 根 的二叉树
-
通过 儿子 — 兄弟 表示法,可以得出一个重要结论:所有的树结构都可以用 二叉树 模拟出来
定义及特性
-
在计算机科学中,二叉树(Binary tree)是每个节点最多只有两个分支的树结构
- 通常分支被称作“左子树”或“右子树”,分支具有左右次序,不能随意颠倒
- 二叉树可以为空
-
二叉树有五种形态
- 空树
- 只有一个根节点
- 只有根节点和左子树
- 只有根节点和右子树
- 根节点和左右子树均存在
-
二叉树的特性
- 一个二叉树第 i 层的最大节点数为:
2^(i-1)(i >= 1) - 深度为 k 的二叉树的最大节点总数为:
2^k - 1(k >= 1) - 对任何非空二叉树 T,若 n0 表示叶节点的个数、n2 是度为 2 的非叶节点个数,那么两者满足关系
n0 = n2 + 1
- 一个二叉树第 i 层的最大节点数为:
特殊的二叉树
完美二叉树
-
定义:在二叉树中,除了最下一层的叶节点外,每层节点都有 2 个子节点,就构成了完美二叉树(满二叉树)
-
性质:对于一棵深度为 k 的完美二叉树
- 共有 2^k - 1 个节点
- 节点个数一定为奇数
完全二叉树
-
完全二叉树定义
- 除二叉树最后一层外,其他各层的节点数都达到最大个数
- 且最后一层从左向右的叶节点连续存在,只缺右侧若干节点

-
完全二叉树的性质
- 深度为 k 的完全二叉树,至少有 2^(k-1) 个节点,至多有 2^k - 1 个节点
- 完美二叉树是特殊的完全二叉树,反之完全二叉树不一定是完美二叉树
二叉树的存储
二叉树的存储常见的方式是 数组 或 链表
数组存储
-
使用数组可以作为二叉树的一种存储方式,即通过广度优先顺序存储每一个节点
-
对于完全二叉树,采用按从上至 下、从左到右顺序存储
-
对于非完全二叉树,需要先将其转化成一个完全二叉树,不存在的节点以空值代替,再进行顺序存储
-
-
根据上述分析可知
- 如果是完全二叉树,使用数组存储无疑是最节省内存的一种方式
- 如果是非完全二叉树,其实会浪费比较多的数组存储空间
链表存储
-
为了减少存储空间的浪费,提高存储的灵活性,存储二叉树通常使用 链表
-
每个链表节点包含三个字段
- 其中
data存储节点数据 - 另外两个 —
left和right,分别存储左右子树的指针
- 其中
二叉树的遍历
先序遍历
先序 遍历规定先访问根节点,再访问其左子树,最后访问右子树