对于开发同学来说,树形结构大家都不陌生。并且在生产或者面试过程中,树形结构也是非常重要的,今天我们来把树形数据结构做一个全面的总结
树🌲
什么是树?
树的种类
树的基本概念和术语😏
- 树的特征:
- 每个节点只有一个父节点
- 树是不能有环的
- 名词解释:
- 节点高度(Height):节点到叶子节点的最长路径
- 节点深度(Depth):根节点到这个节点所经历的边的个数
- 节点层(Level):节点的深度+1
- 树的高度:根节点的高度
- 图示:
- 树底层的数据结构
是数组
无序树
树的任意节点的子节点没有顺序关系。
有序树
树的任意节点的子节点有顺序关系。
二叉树
- 满二叉树
定义: 一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。
图示: 满二叉树外观上是一个三角形
特性: 叶子节点都在同一层并且除叶子节点外的所有节点都有两个子节点。
-
完全二叉树
定义: 对于一颗二叉树,假设其深度为d(d>1)。除第d层外的所有节点构成满二叉树,且第d层所有节点从左向右连续地紧密排列,这样的二叉树被称为完全二叉树;
图示:
-
平衡二叉树(AVL)
Wiki:在计算机科学中,AVL树是最早被发明的自平衡二叉查找树。在AVL树中,任一节点对应的两棵子树的最大高度差为1,因此它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下的时间复杂度都是{\displaystyle O(\log {n})}
平衡二叉树的来源:
AVL 树得名于它的发明者 G. M. Adelson-Velsky 和 Evgenii Landis
为什么会有平衡二叉树?
二叉搜索树一定程度上可以提高搜索效率,但是当原序列有序时,例如序列 A = {1,2,3,4,5,6},构造二叉搜索树如图。依据此序列构造的二叉搜索树为右斜树,同时二叉树退化成单链表,搜索效率降低为 O(n)。
定义: 它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,同时,平衡二叉树必定是二叉搜索树。 -
二叉查找树(二叉搜索树、BST)
定义:
特征:
1. 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
2. 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
3. 任意节点的左、右子树也分别为二叉查找树;
4. 没有键值相等的节点。
- 霍夫曼树
带权路径最短的二叉树称为哈夫曼树或最优二叉树。 - 红黑树
红黑树是一颗特殊的二叉查找树,除了二叉查找树的要求外,它还具有以下特性:
1. 每个节点或者是黑色,或者是红色。
2. 根节点是黑色。
3. 每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
4. 如果一个节点是红色的,则它的子节点必须是黑色的。
5. 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
B-tree(B-树或者B树)
B+树
B*树
树的操作
树的遍历
- 前序遍历(VLR)又名:先根遍历
步骤:- 访问根结点。
- 前序遍历左子树。
- 前序遍历右子树 。
需要注意的是:遍历左右子树时仍然采用前序遍历方法。
- 中序遍历(LDR)又名 ”中根遍历“
步骤:- 中序遍历左子树
- 访问根结点
- 中序遍历右子树
- 后续遍历(LRD)也叫做”后根遍历“
步骤:
- 后序遍历左子树
- 后序遍历右子树
- 访问根结点
- 层序遍历(Level order)
面试题:
有序树
提示词
如何实现tire?