前言
满二叉树:就是很饱满,在不能增加深度的情况下,已经不能添加结点。
完全二叉树:你就想最后层的节点都要左靠,上面的每一层都是满的,满二叉树就是特殊的完全二叉树。
平衡二叉树:树的左右子树的高度差不超过1,这样感觉这棵树很平衡,不会偏向左或右。
二叉搜索树:搜索树就是必须要有数值,左(右)子树上所有结点的值均小(大)于它的根结点的值。
平衡二叉搜索树:就是平衡二叉树和二叉搜索树的结合。
一、满二叉树
如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。简单就是说满二叉树很饱满,没有分支。
这棵二叉树为满二叉树,也可以说深度为k,有2^k-1个节点的二叉树。
二、完全二叉树
完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^(h-1) 个节点。
为什么这样定义
完全二叉树的定义之所以如此,是基于以下几个原因:
-
完全二叉树的定义考虑了节点的连续性和紧凑性。除了最后一层,其它层的节点都是从左到右连续排列的,没有空缺的位置,这样可以充分利用存储空间,减少了存储的浪费。
-
完全二叉树的定义使得其在存储和操作上更加高效。由于节点的连续性,可以使用数组来存储完全二叉树,不需要使用指针等额外的数据结构。同时,完全二叉树的定义也方便了基于索引的操作,例如根据索引快速计算出节点的父节点、左子节点和右子节点。
-
完全二叉树的定义使得其在一些算法和数据结构中的应用更加方便。例如,完全二叉树常用于堆(Heap)的实现,堆是一种常见的用于高效获取最大或最小元素的数据结构,而完全二叉树的特性可以使堆的操作更加简单和高效。
三、平衡二叉搜索树
1.首先来说二叉搜索树
前面介绍的树,都没有数值的,而二叉搜索树是有数值的了,二叉搜索树是一个有序树。
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 它的左、右子树也分别为二叉排序树
- 下面这两棵树都是搜索树
2.平衡二叉搜索树
平衡二叉搜索树:又被称为AVL(Adelson-Velsky and Landis)树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
C++中map、set、multimap,multiset的底层实现都是平衡二叉搜索树,所以map、set的增删操作时间时间复杂度是logn,注意我这里没有说unordered_map、unordered_set,unordered_map、unordered_set底层实现是哈希表。