参考:https://www.hello-algo.com/chapter_tree/binary_tree/#711
1. 介绍
树存储不同于数组和链表的地方在于既可以保证数据检索的速度,又可以保证数据插入删除修改的速度,二者兼顾。
二叉树是一种很重要的数据结构,是非线性的结构,
非常多其他数据结构都是基于二叉树的基础演变而来的。
如:一般二叉树、完全二叉树、满二叉树、线索二叉树、哈夫曼树、
二叉排序树、平衡二叉树、红黑树、B树。
普通的二叉树,很难构成现实的应用场景,但因其简单,常用于学习研究,
平衡二叉树则是实际应用比较多的。
常见于快速匹配、搜索等方面。
常用的树有:AVL树、红黑树、B+树、Trie(字典)树。
1、AVL树: 最早的平衡二叉树之一。应用相对其他数据结构比较少。windows对进程地址空间的管理用到了AVL树。
2、红黑树: 平衡二叉树,广泛用在C++的STL中。如map和set都是用红黑树实现的。还有Linux文件管理。
3、B/B+树: 用在磁盘文件组织 数据索引和数据库索引。
4、Trie树(字典树): 用在统计和排序大量字符串,如自动机、M数据库索引。
2 概念
2.1 二叉树的每个节点最多只能有两个子节点(左、右节点)
1. 「根节点 root node」:位于二叉树顶层的节点,没有父节点。
2. 「叶节点 leaf node」:没有子节点的节点,其两个指针均指向None
3. 「边 edge」:连接两个节点的线段,即节点引用(指针)。
4. 节点所在的「层 level」:从顶至底递增,根节点所在层为 1 。
5. 节点的「度 degree」:节点的子节点的数量。在二叉树中,度的取值范围是 0、1、2 。
6. 二叉树的「高度 height」:从根节点到最远叶节点所经过的边的数量。
7. 节点的「深度 depth」:从根节点到该节点所经过的边的数量。
8. 节点的「高度 height」:从距离该节点最远的叶节点到该节点所经过的边的数量。
2.2 完全二叉树
若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。
特征:
叶子结点只可能在最下面的两层上出现,对任意结点,若其右分支下的子孙最大层次为L,则其左分支下的子孙的最大层次必为L或L+1
图示:
特点:
(1)若i为奇数且i>1,那么tree[i]的左兄弟为tree[i-1];
(2)若i为偶数且i<n,那么tree[i]的右兄弟为tree[i+1];
(3)若i>1,tree[i]的双亲为tree[i div 2];
(4)若2*i<=n,那么tree[i]的左孩子为tree[2*i];若2*i+1<=n,那么tree[i]的右孩子为tree[2*i+1];
(5)若i>n/2,那么tree[i]为叶子结点(对应于(3));
(6)若i<(n-1)/2,那么tree必有两个孩子(对应于(4));
(7)满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树;
(8)完全二叉树第i层至多有2^(i-1)个节点,共i层的完全二叉树最多有2^i-1个节点。