图片和部分文字来源于(https://www.jianshu.com/p/bf73c8d50dc2)
1. 重点概念
-
节点
节点是数据结构中的基础,是构成复杂数据结构的基本组成单位 -
树
树是 n (n >= 0) 个结点的有限集,当 n = 0 时称为空树,在任意一颗非空树中:- 有且仅有一个特定的节点称为根节点 (Root)
- 当 n > 1 时,其余节点可分为 m (m > 0) 个互不相交的有限集 T1、T2、T3、… 、Tn,其中么一个集合本身也是一棵树,称为根的子树
-
节点的度
节点拥有的子树数目称为该节点的度 -
节点关系
- 孩子节点
某一节点拥有的子树的根节点为该节点的孩子节点(在上图中,B、C 节点为 A 节点的孩子节点) - 双亲节点
相应的,拥有子树的根节点的节点为该节点的双亲节点(在上图中,A 节点为 B、C 节点的双亲节点) - 兄弟节点
同一个双亲结点的孩子节点之间互称兄弟节点(在上图中,B 节点与 C 节点互称兄弟节点) - 叶子节点
没有孩子节点的节点称为叶子节点 - 节点层次
从一颗树的根节点开始计算,根节点为第一层,其孩子节点为第二层,以此类推
- 孩子节点
-
树的深度
树的最高层数为树的深度,在上图中,树的深度为4
2. 二叉树
-
定义
二叉树是每个节点最多有两个孩子节点的树,或者为空树(此时称为空二叉树) -
特点
- 每个节点最多有两颗子树,也就是最多有两个孩子节点,所以树中不可能出现度大于2的节点
- 其左子树和右子树是有顺序的,次序不能颠倒
- 即时只有一颗子树也要区分左右
- 在二叉树的第 i 层上,最多拥有 2^(i-1) 个节点
- 二叉树的深度为 k ,那么此树最有拥有 2^k-1 个节点
-
满二叉树
在一棵二叉树中,如果节点都拥有左子树和右子树,并且所有叶子节点都存在于同一层上,这样的二叉树称为满二叉树。其特点:
- 叶子节点只能出现在最下一层
- 非叶子节点的度一定是2
- 在同样深度的二叉树中,满二叉树的节点个数是最多的,叶子数也是最多的
-
完全二叉树
对一颗深度为 k 的,有 n 个节点的二叉树,当且仅当其每一个节点都与深度为 k 的满二叉树中编号从1 至 n 的节点一一对应时称之为完全二叉树。其特点:
- 叶子节点只能出现在最下层和次下层
- 最下层的叶子节点出现在左侧
- 次下层的叶子节点出现在右侧
- 如果节点的度为 1,那么此节点只拥有左子树
- 满二叉树一定是完全二叉树,反之不成立
-
顺序存储
二叉树的顺序存储结构就是使用一维数组存储二叉树中的节点,并且节点的存储位置就是数组的下标引索
3. 二叉树遍历
二叉树的遍历时至从二叉树的根节点出发,按照某种次序一次访问二叉树中的所有系欸按,使得二叉树中每个节点被访问有且只有一次,二叉树的访问顺序次序可以分为四种:
- 前序遍历
- 中序遍历
- 后序遍历
- 层序遍历
-
前序遍历
前序遍历通俗地说就是从根节点开始,先遍历完左侧再遍历右侧,每当第一次到达一个节点时就输出节点存储的数据,即使抵达了叶子节点,仍要寻找子节点,试图遍历(这句话再中序遍历和后续遍历中能显示)
- 从根节点出发,第一次抵达A,输出A
- 从左往右,第一次抵达B,输出B
- B有左子树,继续往下,第一次抵达D,输出D
- D有左子树,继续往下,第一次抵达H,输出H
- H没有左子树,返回D,第二次抵达D,D还有右树,第一次抵达I,输出I
- I没有左子树,返回D,第三次抵达D,返回B,第二次抵达B,B有右子树,第一次抵达E,输出E
- E还有左子树,继续往下,第一次抵达J,输出J
- J没有左子树,返回E,第三次抵达E,返回B,第三次抵达B,返回A,第二次抵达A,A还有右子树,第一次抵达C,输出C
- C还有左子树,继续往下,抵达F,输出F
- F没有左子树,返回C,第二次抵达C,C还有右子树,第一次抵达G
结果为:ABDHIEJCFG
-
中序遍历
中序遍历通俗地说就是从二叉树的根节点出发,先遍历完左侧再遍历右侧,当第二次到达节点时就输出数据,即使抵达了叶子节点,仍要寻找子节点,试图遍历
- 从根节点出发,第一次抵达A,继续往下
- 第一次抵达B,继续往下
- 第一次抵达D,继续往下
- 第一次抵达H,H的左子树为空,返回H,第二次抵达H,输出H
- 返回D,第二次抵达D,输出D
- D还有右子节点,第一次抵达I,I的左子树为空,返回I,第二次抵达I,输出I
- 返回D,第三次抵达D,返回B
- 第二次抵达B,输出B
- B还有右子树,第一次抵达E,继续往下
- 第一次抵达J,J的左子树为空,返回J,第二次抵达J,输出J
- 返回E,第二次抵达E,输出E
- 返回B,第三次抵达B,返回A
- 第二次抵达A,输出A
- A还有还有右子树,第一次抵达C,继续往下
- 第一次抵达F,F的左子树为空,返回F,第二次抵达F,输出F
- 返回C,第二次抵达C,输出C
- C还有右子树,继续往下
- 第一次抵达G,G的左子树为空,返回G,第二次抵达G,输出G
结果为:HDIBJEAFCG
-
后序遍历
中序遍历通俗地说就是从二叉树的根节点出发,先遍历完左侧再遍历右侧,当第三次到达节点时就输出数据,即使抵达了叶子节点,仍要寻找子节点,试图遍历
- 从根节点出发,第一次抵达A,继续往下
- 第一次抵达B,B有孩子节点,继续往下
- 第一次抵达D,D有孩子节点,继续往下
- 第一次抵达H,H没有左子树,返回H,第二次抵达H,H没有右子树,返回H,第三次抵达H,输出H
- 返回D,第二次抵达D,D有右子节点,继续往下
- 第一次抵达I,I没有左子树,返回I,第二次抵达I,I没有右子树,返回I,第三次抵达I,输出I
- 返回D,第三次抵达D,输出D
- 返回B,第二次抵达B,B有右子节点,继续往下
- 第一次抵达E,E有孩子节点,继续往下
- 第一次抵达J,J没有左子树,返回J,第二次抵达J,J没有右子树,返回J,第三次抵达J,输出J
- 返回E,第二次抵达E,E没有右子树,返回E,第三次抵达E,输出E
- 返回B,第三次抵达B,输出B
- 返回A,第二次抵达A,A有右子树,继续往下
- 第一次抵达C,C有左子树,继续往下
- 第一次抵达F,F没有左子树,返回F,第二次抵达F,F没有右子树,返回F,第三次抵达F,输出F
- 返回C,第二次抵达C,C有右子树,继续往下
- 第一次抵达G,G没有左子树,返回G,第二次抵达G,G没有右子树,返回G,第三次抵达G,输出G
- 返回C,第三次抵达C,输出C
- 返回A,第三次抵达A,输出A
结果:HDJEBFGCA
-
层序遍历
层序遍历就是按照树的层次自上而下遍历
结果:ABCDEFGHIJ
4. 考点
-
已知前序遍历和中序遍历,确定一颗二叉树
若一颗二叉树的前序遍历为ABCDEF,中序遍历为CBAEDF,求这棵二叉树?
分析:前序遍历第一个节点为根节点,所以我们得到根节点为A,中序遍历根节点位语序列中间,所以此二叉树的左子树有CB节点,右子树有EDF节点
同理对于CB,我们得到C为B的双亲节点,B为叶子节点;对于DEF,我们得到D为EF的双亲节点,E为左节点,F为右节点