这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战
1 二叉树(Binary Tree)
二叉树是每个节点最多有两个子节点的树。二叉树的叶子节点有0个字节点,根节点或内部节点有一个或两个子节点。
存储结构:
public class TreeNode {
// 数据域
private Object data;
// 左孩子指针
private TreeNode leftChild;
// 右孩子指针
private TreeNode rightChild;
}
1.1 斜树
- 左斜树:所有结点都只有左子树
- 右斜树:所有结点都只有右子树
1.2 满二叉树
一颗二叉树的所有分支结点都存在左子树和右子树,且所有叶子节点都只存在在最下面一层。
1.3 完全二叉树
若二叉树的深度为k,二叉树的层数从1到k-1层的结点都达到了最大个数,在第k层的所有结点都集中在最左边,这就是完全二叉树。完全二叉树由满二叉树引出,满二叉树一定是完全二叉树,但完全二叉树不一定是满二叉树。
2 二叉搜索树(Binary Search Tree)
二叉搜索树, 又叫二叉查找树,它是一棵空树或是具有下列性质的二叉树:
- 若左子树不空,则左子树上所有结点的值均小于它的根结点的值
- 若右子树不空,则右子树上所有结点的值均大于它的根结点的值
- 它的左、右子树也分别为二叉搜索树
效率总结
- 访问/查找:最好时间复杂度
O(logN)
,最坏时间复杂度O(N)
- 插入/删除:最好时间复杂度
O(logN)
,最坏时间复杂度O(N)
3 平衡二叉树(AVL Tree)
二叉查找树在最差情况下竟然和顺序查找效率相当,这是无法仍受的。事实也证明,当存储数据足够大的时候,树的结构对某些关键字的查找效率影响很大。当然,造成这种情况的主要原因就是BST不够平衡(左右子树高度差太大)。既然如此,那么我们就需要通过一定的算法,将不平衡树改变成平衡树。因此,AVL树就诞生了。
平衡二叉树全称叫做 平衡二叉搜索(排序)树
,简称 AVL树。高度为 logN
。本质是一颗二叉查找树,AVL树的特性:
- 它是一棵空树或左右两个子树的高度差的绝对值不超过
1
- 左右两个子树也都是一棵平衡二叉树
如下图,根节点左边高度是3,因为左边最多有3条边;右边高度而2,相差1。根节点左边的节点50的左边是1条边,高度为1,右边有两条边,高度为2,相差1。
效率总结
- 查找:时间复杂度维持在
O(logN)
,不会出现最差情况 - 插入:插入操作时最多需要
1
次旋转,其时间复杂度在O(logN)
左右 - 删除:删除时代价稍大,执行每个删除操作的时间复杂度需要
O(2logN)