二叉树,是度为二的树,二叉树的每一个节点最多只有二个子节点,且两个子节点有序。
下面开始介绍几种常见的二叉树类型:
1. 完全二叉树
若设二叉树的深度为k,除第k层外,其他各层(1~(k-1)层)的节点数都达到最大值,且第k层所有的节点都连续集中在最左边,这样的树就是完全二叉树。如图:
(图片仅参考网友,侵删)
完全二叉树是一种效率很高的数据结构,而堆是一种完全二叉树或者近似完全二叉树,因此堆的效率也很高;像十分常用的排序算法、Dijkstra算法、Prim算法等都要用堆才能优化,二叉排序树的效率也要借助平衡性来提高,而平衡性是基于完全二叉树的。
(以上摘自:https://www.jianshu.com/p/6a30657bf894)
2. 满二叉树
满二叉树的定义分两种:国内定义和国外(国际)定义。
国内定义:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。如图:
国外(国际)定义:如果一棵二叉树的结点要么是叶子结点,要么它有两个子结点,这样的树就是满二叉树。(一棵满二叉树的每一个结点要么是叶子结点,要么它有两个子结点,但是反过来不成立,因为完全二叉树也满足这个要求,但不是满二叉树),如图:
当然,不难看出,国外(国际)的定义已经包含了国内的定义了,也就是国内的定义是国外定义的子集。
(以上摘自:https://baike.baidu.com/item/%E6%BB%A1%E4%BA%8C%E5%8F%89%E6%A0%91/7773283?fr=aladdin)
3. 二叉查找树(BST)
二叉查找树,又称二叉排序树,二叉搜索树。二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
- 若左子树不空,则左子树上所有节点的值均小于它的根节点的值;
- 若右子树不空,则右子树上所有节点的值均大于它的根节点的值;
- 左、右子树也分别为二叉排序树;
- 没有键值相等的节点。
4. 平衡二叉树(AVL)
平衡二叉树实际上也是一个二叉查找树,但是又和二叉查找树有所不同。平衡二叉树包括了二叉查找树的所有特性,但与二叉查找树不同的是,平衡二叉树的平衡因子不能超过1。
意思是说,要么它是一棵空树,要么它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。
在网上找了很多关于平衡二叉树的文章,都只阐述了以上原理,但是什么是平衡因子?下面就这点详细的介绍一下,如图:
a树的根节点是节点5,节点5的深度为4,所以a树的深度为4,下面计算所有节点的平衡因子:
- 节点5,左子树深度为3,右子树深度为2,那么,节点5的平衡因子为|3-2|=1;
- 节点2,左子树深度为1,右子树深度为2,平衡因子为|1-2|=1;
- 节点6,无左子树,故左子树深度为0,右子树深度为1,平衡因子为|0-1|=1;
- 节点1,无左子树和右子树,故左右子树的深度均为0,平衡因子为|0-0|=0;
- 节点4,左子树深度为1,无右子树,故右子树深度为0,平衡因子为|1-0|=1;
- 节点7,无左子树和右子树,故左右子树的深度均为0,平衡因子为|0-0|=0;
- 节点3,无左子树和右子树,故左右子树的深度均为0,平衡因子为|0-0|=0;
通过上述计算,得到a树的所有节点的平衡因子,均没有超过1,所以a树是一个平衡二叉树。同理计算得到b树是一个二叉查找树,但不是一个平衡二叉树。
本文主要记录了各种二叉树的类型,接下来会专门写几篇文章,记录如何通过代码组成各种二叉树,并且对二叉树进行增删查改,虽然网上有很多类似的文章,但是我还是觉得自己写一遍,是另一种理解,感觉这是一个大工程,告诉我自己,坚持下去~~
ps:本文多是从其他地方复制的理论,结合自己的理解,可能并不是特别完整,如果有错误的地方,欢迎指正,谢谢~~