数据结构 —— 二叉树|8月更文挑战

103 阅读3分钟

这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战

1 二叉树(Binary Tree)

二叉树是每个节点最多有两个子节点的树。二叉树的叶子节点有0个字节点,根节点或内部节点有一个或两个子节点。

BinaryTree.png

存储结构

 public class TreeNode {
     // 数据域
     private Object data;
     // 左孩子指针
     private TreeNode leftChild;
     // 右孩子指针
     private TreeNode rightChild;
 }

1.1 斜树

  • 左斜树:所有结点都只有左子树
  • 右斜树:所有结点都只有右子树

斜树.png

1.2 满二叉树

一颗二叉树的所有分支结点都存在左子树和右子树,且所有叶子节点都只存在在最下面一层。

满二叉树.png

1.3 完全二叉树

若二叉树的深度为k,二叉树的层数从1到k-1层的结点都达到了最大个数,在第k层的所有结点都集中在最左边,这就是完全二叉树。完全二叉树由满二叉树引出,满二叉树一定是完全二叉树,但完全二叉树不一定是满二叉树。

完全二叉树.png

2 二叉搜索树(Binary Search Tree)

二叉搜索树, 又叫二叉查找树,它是一棵空树或是具有下列性质的二叉树:

  • 若左子树不空,则左子树上所有结点的值均小于它的根结点的值
  • 若右子树不空,则右子树上所有结点的值均大于它的根结点的值
  • 它的左、右子树也分别为二叉搜索树

BinarySearchTree.png

效率总结

  • 访问/查找:最好时间复杂度 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。

AVLTree.png

效率总结

  • 查找:时间复杂度维持在O(logN),不会出现最差情况
  • 插入:插入操作时最多需要 1 次旋转,其时间复杂度在O(logN)左右
  • 删除:删除时代价稍大,执行每个删除操作的时间复杂度需要O(2logN)