树和二叉树
树
-
除了线性结构的数组,链表,栈和队列外,还有一些非线性机构,如树和图
-
生活里的树形结构:族谱,职位关系,课本的章节目录
-
树的定义:
- 树是n(
n
≥
0
n \ge 0
n≥0)个节点的有限集。当n=0时,称为空树。任意一个非空树有如下特点
- 有且仅有一个特定的称为根的节点
- 当n>1时,其余节点可分为m(m>0)个互不相交的有限集,每个集合本身又是一个树,称为根的子树
- 树是n(
n
≥
0
n \ge 0
n≥0)个节点的有限集。当n=0时,称为空树。任意一个非空树有如下特点
-
一些概念:
- 根节点
- 叶子节点
- 子树
- 父节点
- 兄弟节点
- 孩子节点
- 树的高度
二叉树简介
-
定义:树的每个节点最多有2个孩子节点。
- 可能1个孩子,可能没有。
- 左孩子,右孩子,顺序固定
-
两种特殊形式:满二叉树和完全二叉树
-
满二叉树:一个二叉树的所有非叶子节点都有左右孩子,并且所有叶子几点都在一个层级。
- 就是每个分支都是满的
-
完全二叉树:对一个有n个节点的二叉树,按层级顺序编号,从1到n。如果这个树所有节点和同深度的满二叉树的编号从1到n节点位置相同。则这棵树为完全而二叉树。
-
总结:满二叉树要求更严:满二叉树所有分支都满着,且叶子节点都在一层。完全二叉树只要保证最后一个节点之前的节点都齐全即可。
-
-
二叉树如何存储
-
链式存储
二叉树的每个节点都包含3个部分-
存储数据的data变量
-
指向左孩子的left指针
-
指向有孩子的right指针
-
-
数组存储
按照层级顺序把二叉树的节点放到数组中的对应位置,如果有左右孩子空缺,那对应的数组也空缺。这样更方便定位孩子节点和父节点。
- 找孩子节点:父节点下标时 p a r e n t parent parent,则左孩子小标为 2 × p a r e n t + 1 2 \times parent +1 2×parent+1;右孩子下标为 2 × p a r e n t + 2 2 \times parent +2 2×parent+2
- 左孩子下标是 l e f t C h i l d leftChild leftChild,那父节点下标就是 ( l e f t C h i l d − 1 ) / 2 (leftChild - 1)/2 (leftChild−1)/2
- 孩子少时很浪费空间,那什么样的二叉树适合数组存储呢?
- 后面的二叉堆,一种特殊的完全二叉树,就是数组存储
-
-
二叉树应用:查找操作和维持相对顺序
-
查找操作
二叉查找树:在二叉树的基础上加了以下几个条件:
- 如果左子树不空,则左子树上所有节点的值均小于根节点的值
- 如果右子树不空,则右子树上所有节点的值均大于根节点的值
- 左右子树也是二叉查找树
总结:和根节点比,方便查找,如果节点分布相对均匀,则时间复杂度为O(logn)。与二分法类似
-
维持相对顺序
二叉查找树有另一个名字:二叉排序树
- 插入元素时和根节点比较
- 可能导致不平衡,需要自平衡方式
- 红黑树,AVL树等方式
- 二叉堆也有一定的顺序,后面详解
-