二叉树

二叉树是连通无环图,并且每个结点的度最大为2,度就是有几个直接的子结点。

  • 二叉树
    • 满二叉树
    • 完全二叉树
    • 平衡二叉树

满二叉树

每一层都挂满节点的二叉树,就是满二叉树

节点数:2 ^ h - 1
h 为树的高度(可以理解为二叉树层数)

完全二叉树

完全二叉树就是除了最后一层,上层都是满节点,最后一层从左到右排。可以不排满

得出结论满二叉树 “包含” 完全二叉树,反过来不行!

使用场景

二叉树的特点:“叶子节点的位置比较规律”。因此在对数据进行排序或者查找时可以用到它,比如堆排序就使用了它。

二叉排序树

二叉树的提出其实主要就是为了提高查找效率,比如我们常用的 HashMap 在处理哈希冲突严重时,拉链过长导致查找效率降低,就引入了红黑树

二分查找可以缩短排序的时间,但是它要求 查找的数据必须是有序 的。每次查找、操作时都要维护一个有序的数据集,于是有了二叉排序树这个概念。

  • 特点
    • 左子树所有节点值均小于它的根节点的值
    • 右子树所有节点值均大于或等于根节点的值
    • 左、右子树也分别为二叉排序树

排序二叉树也可能出现下图:

插入的元素是有序的,生成的二叉排序树就是一个链表,这种情况下,需要遍历全部元素才行

插入有序的元素时不太好控制,按二叉排序树的定义,我们无法判断当前的树是否需要调整。

因此就要用到平衡二叉树(AVL 树)了。

平衡二叉树

平衡二叉树也称为AVI树。平衡二叉树的提出就是为了保证树不至于太倾斜,尽量保证两边平衡。

  • 特点
    • 平衡二叉树要么是一棵空树
    • 在AVL树中任何节点的两个子树的高度最大差别为1
    • 子树也必须是一棵AVL树
    • 左子树所有节点都小于根节点的值,右子树节点都大于根节点的值

现有 无序数组 [35,16,44,56,78,12,96,21]

本文通篇都是讲述二叉树概念,未涉及实现,后续补上。