一、树的结构与特点
1、树的组成
树是一种递归的数据类型,样子就像倒过来的树,组成如下:
①树根(root):树的顶端节点,通过链接/边指向所有子树
②子树
③链接/边(edges):比如指针或引用的方式建立链接
2、树的其他结构
①叶子(leaf):无子节点的末端节点
②一个节点相关的下属节点称为该节点的children
3、树的其他特点
①树右N个节点,就一定有N-1条边
②遍历一棵树是单向的,从树根开始到叶子结束
③同一层级的节点深度相同,所以根据节点的深度分为不同的层级。

4、树的高度与深度
节点X的深度:从根到节点X的路径长度
节点X的高度:从该节点到与一个叶子节点的最长路径(从上至下)
区别记忆:因为树是倒置结构,所以高度是从下往上,深度是从上往下。
补充:
①树根的深度为0
②不存在的节点(孩)的深度为-1
③空树的高度 = -1
④叶子的高度 = 0
5、相关计算
设树的高度是h,节点数为n,最大层数是第i层
①最大节点数 n = +
+...+
=
- 1
②最小高度 h = log2(n+1) - 1 = 【log2 (n)】向下取整
③最大高度 h = n - 1 (稀疏树:只有一个孩)
6、时间复杂度
①完全/完美二叉树:O( log2(n) )
②稀疏树:O(n)
二、二叉树
1、定义
二叉树:每个节点最多只有两个子节点(children),分别称为左孩、右孩
2、分类
①严格二叉树:不超过两孩
②完全二叉树:除了最后一层外其他层的节点都完全填充(图1)
③完美二叉树:所有节点左对齐的完全二叉树(左边没有空节点)(图2)
④平衡二叉树:每个节点的左孩和右孩的高度差不超过k=1
⑤空树:没有节点
3、二叉树的子树
子树的高度 = 左孩与右孩的高度差
上图:左孩的高度是1,右孩(不存在的孩)高度为-1,所以该子树的高度是2
4、创建二叉树
方法:创建动态节点,使用指针或引用将节点链接起来
特殊:用数组创建完美二叉树
三、二叉搜索树
1、特点
①所有节点的左孩(左子树)的值比该节点的值小(左孩更小)
②所有节点的右孩(右子树)的值比该节点的值大(右孩更大)
③搜索、插入、删除的时间复杂度最小,都是O ( log2n )
④二叉搜索树必须是平衡二叉树
(这种像链表一样的二叉树也可以是二叉搜索树)
2、二分法搜索
思路:通过不断与段落中点进行比较来缩小范围,较小则取段落中点以左的段,较大则取段落中点以右的段。
举例:
确定段落端点
取区间中点
10比15小所以取8-12这段
再取区间中点,重复以上步骤。
二分查找法的运算时间(时间复杂度)是O ( log2(n) )
3、用二叉搜索树进行搜索
原理:二叉树搜索其实就是二分查找,也是通过比较来缩小范围。当二叉搜索时是完美二叉树时,其时间复杂度就是O ( log2(n) )
需要注意的是,左子树下最大的值也不会大于该节点的值,同理,右子树下最小的值也不会小于该节点的值
举例:
从根节点开始比较,路线是15→10→12,因为12一定存在于根节点的左子树范围内,同时也一定在10的右子树范围内。
3、在二叉搜索树中插入
同理也是先进行比较来确定范围,直到最后一个相近的节点。如果插入的值比它小就成为它的左孩,比它大就是右孩。
4、删除二叉搜索树的节点
先搜索再删除,所以时间复杂度和搜索时相同。
注:插入和删除都容易让二叉搜索树变得不平衡