树的基本概念部分
树是一种抽象的、分层的、递归的数据结构。
树的定义:n(n>=0)个有限节点组成的具有层次关系的集合。n=0时,称为空树。
也可以树由根节点和多个不相交的子树构成。并且,这些互不相交的子树构成了森林。
节点的度:节点的子节点数
树的度:树中最大的节点的度
节点深度:跟自然界一样,从上到下,从1依次递增 (有的教材定义从0开始
节点高度:跟自然界一样,从下到上,从1依次递增
树的深度 / 高度:树中最大的节点深度/ 高度
叶子节点:度为0的节点
分支节点:度不为0的节点
双亲结点:节点唯一的前驱结点
孩子节点:节点的子节点
祖先节点:节点的双亲节点的双亲结点 到 根节点之间的所有节点 ,闭区间
子孙节点:节点的孩子节点的孩子节点 到 叶子节点之间的所有节点,闭区间
兄弟节点:具有相同双亲结点的节点
堂兄弟节点:双亲节点不一样、但在同一层次的节点
根节点:树中唯一的没有双亲节点的节点
内部节点:除了根节点和叶子节点以外的所有节点
如图,A是根节点,K、L、M都是叶子节点,其他的都是分支节点;
B、C、D都是A的孩子节点,A是 B、C、D的双亲节点;
B、A都是K的祖先节点,E、K都是A的子孙节点;
B、C、D互为兄弟节点,F、G互为堂兄弟节点
内部节点有B、C、D、E、F、G、H、I、J
该树的度为3,树的高度为4。
有序树:树中节点的左右子树的出现是有次序的,如果交换,就变成了另一棵不同的树。
二叉查找树就是典型的有序树。
无序树:与有序树相反。
结点的权:在一些应用中,赋予树中结点的一个有某种意义的实数。
结点的路径:结点到根节点的路线。
结点的路径长度:结点到树根之间的路径长度。
结点的带权路径长度:结点到树根之间的路径长度 * 该结点的权值。
树的路径:从根节点到某个叶子结点的路线。
树的路径长度:从根结点到每一个结点的路径长度之和。
【ps:在结点数目相同的二叉树中,完全二叉树的路径长度最短。】
树的加权路径长度:所有叶结点的加权路径长度之和。
树内部路径长度:除叶结点外的所有结点的路径长度之和。
树外部路径长度:所有叶结点的路径长度之和。
森林:不相交的树构成的集合。把一棵树的根节点去掉,就形成森林。
树的性质:
1、树的结点数 = 边数 + 1(即树的度+1
2、度为 m 的树中第 i 层上至多有 个结点( i >= 1)
3 、高度为 h 的 m 叉树至多有个结点
4 、具有 n 个结点的 m 叉树的最小高度为
二叉树
定义:度小于等于 2的树。二叉树是有序树。
特殊二叉树:
1、斜树
(1)左斜树:所有节点都只有左子树的二叉树
(2)右斜树:所有节点都只有右子树的二叉树
2、满二叉树
在二叉树中,所有分支节点都有左子树和右子树,并且叶子节点们在同一层。
3、完全二叉树
在二叉树中,所有叶子节点的深度 <=1,最后一层中所有节点都聚集在左边 的树。
二叉树的存储结构
1、使用数组进行存储
即,结点的位置用数组索引来代表。
适用于完全二叉树/满二叉树,刚好能使数组的空间占满;
否则,会造成数组中多个位置不存在结点,尤其是斜树,会大大浪费内存空间。如图
2、使用二叉链表
即,使用含一个 数据域和两个指针域(分别指向左右孩子) 来定义结点的数据结构。
二叉树的遍历方式
1、前序遍历/ 深度遍历
2、中序遍历
3、后序遍历
4、层次遍历/ 广度遍历
顾名思义,前序遍历就是将根节点、双亲结点优先遍历,再分别遍历左子树、右子树结点;
而广度遍历就是按层次,由浅到深进行遍历 。
以上图为栗:
前序遍历/ 深度遍历: ABDEGCF (一个结点一定比他的左 / 右子树优先遍历
中序遍历:DBGEACF (当一个结点有左子树还没遍历,那一定还没轮到它
后序遍历:DGEBFCA (当一个结点有左 / 右子树还没遍历,那一定还没轮到它
层次遍历 /广度遍历:ABCDEFG
二叉搜索树/ 二叉排序树 Binary Search Tree
定义:所有左子节点都小于根节点、所有右子节点都大于根节点,且树中的每一节点也都符合这个性质的二叉树 / 空树。
BST一般使用链表结构来实现,可以进行高效的插入、查询、删除等操作。
其操作复杂度与树的高度有关,如果共有n个元素,那么平均每次操作最少需要O(logn)的时间。
ps:下方的程序实现代码中提到了继承节点,其定义如下:
也称其为“直接后继” ,在代码中 ,同理亦可用“直接前驱” 节点来互换值。
上面提到,BST的相关操作复杂度与其树高度有着密不可分的联系 。举个栗子,当二叉树的结构变成一种类似于斜树的结构时,此时树达到同节点总数的树最高度,此时的树相当于变成了一个链表,查询效率会大大降低。
因此,我们需要引入对树的高度进行适度控制的:
平衡二叉搜索树 BBST
定义:任一节点的平衡因子都在 [-1, 0, 1] 之间的二叉搜索树,即,任一节点的左右子树高度差不超过1的BST。
ps:注意这并不代表树中任意两个节点的高度之差一定是小于等于1哦,是有可能大于1的。
平衡因子:节点的【左子树高度 - 右子树高度】所得。
那么我们是怎么实现高度差的控制呢…
那就是通过左旋、右旋以及两者的组合啦!(没错就是左旋肉碱的左旋😏