前言
本文是记录个人对数据结构的学习,文中所用可能会采用其他大神的图、思路。
树
一种N个节点组成的、具有层次的结构集合
特性:非根节点只有1个父节点;
相关名词概述:
1)兄弟结点:有相同父节点的结点
2)结点的度:结点的子结点的数目
3)叶结点:度为0的结点
4)分支结点:度不为0的结点
5)树的度:树中结点最大的度
6)层次:根结点的层次为1,其余结点的层次等于该结点的父结点的层次+1;
7)树的高度:树中结点的最大层次
8)森林:由0个或多个不相交的树组成
二叉树
树的度为2的树,且树可以为空
特性:
1)第N层的结点数目最多为2^N-1
2)深度为N的二叉树,最多有2^N-1
3)含N个结点的二叉树的高度,至少为Log2^N +1
特殊的二叉树:满二叉树、完全二叉树
满二叉树:高度为N且结点为2^N-1的二叉树
完全二叉树:从上到下,从左到右依次安排结点,只有该层排满后才可以安排下一层的结点,且编号没有断,如下图
存储结构:
1)顺序存储:即从上到下,从左到右依次遍历存储(层序遍历,适用于完全二叉树),如下图所示:
2)链式存储:二叉链表结构,如下图,每个结点最多有2个子树
所以结构内容为1个数据、2个子结点指针域:
typedef struct BiTNode{
TElemType data;//数据
struct BiTNode *lchild, *rchild;//左右孩子指针
} BiTNode, *BiTree;
如下图所示为二叉链表结构:
遍历方式
示例用图如下:
1)前序遍历:从根结点出发,先左后右,遇到结点就输出(先跟,后左,再右),即:ABDHIEJCFG
2)中序遍历:从根结点出发,先左后右,第二次遇到结点就输出(先左,后根,再右),即:HDIBJEAFCG
3)后序遍历:从根结点出发,先左后右,第三次遇到结点就输出(先左,后右,再根),即:HIDJEBFGCA
4)层序遍历:从上到下,从左到右输出,即ABCDEFGHIJ
二叉排序树
又名二叉查找树,或为空树,或具备以下特性:
1)若左子树不为空,则左子树所有结点值小于根结点值
2)若右子树不为空,则右子树所有结点值大于根结点值
3)左/右子树也分别为二叉排序树
例图所示:
二叉排序树用于数据查询
平均查找时间复杂度为log2n,n为结点数,极端情况除外(深度最小的树和深度最大的树,随机情况的时间复杂度介于最大树与最小数之间)
例图所示:结点为6,左为深度最小树,右为深度最大树
插入:根据左<根<右的原则,新插入一个结点;如果序列中存在相同结点,不需要插入;
删除:
情况1:删除的是叶结点,此情况不会破坏结构,直接修改双亲结点指针;
情况2:删除结点只有左(右)子树,此情况需要将左(右)子树上推,替代删除的结点;
情况3:删除结点左右子树都有,此情况需要将左子树种最大值结点上推或者将右子树最小结点上推,替代删除的结点;
平衡二叉树(AVL树)
是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树
优势:很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(log2n)。但是频繁旋转会使插入和删除牺牲掉O(log2n)左右的时间
插入导致不平衡情况:
1)LL——在A的左孩子的左子树中插入导致不平衡
2)RR——在A的右孩子的右子树中插入导致不平衡
3)LR——在A的左孩子的右子树中插入导致不平衡
4)RL——在A的右孩子的左子树中插入导致不平衡
总结:只有左孩子才能右上旋转,只有右孩子才能左上旋转
删除:
1)删除为当前根结点:
左/右子树都非空:
a.左子树高度大于右子树高度,将左子树中最大的那个元素赋给当前根节点,然后删除左子树中元素值最大的那个节点
b.左子树高度小于右子树高度,将右子树中最小的那个元素赋给当前根节点,然后删除右子树中元素值最小的那个节点
左/右子树存在空树:直接用那个非空子树或者是NULL替换当前根节点即可
2)要删除的节点元素值小于当前根节点T值,在左子树中进行删除
实施删除后,需要是否平衡,不平衡则要旋转
3)要删除的节点元素值大于当前根节点T值,在右子树中进行删除
红黑树
自平衡的二叉查找树,是一种高效的查找树,例如STL中map由红黑树实现
特性:
1)节点是红色或黑色。
2)根是黑色。
3)所有叶子都是黑色(叶子是NULL节点)。
4)每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)
5)从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点(简称黑高)
相较于AVL树:
1)AVL树的时间复杂度虽然优于红黑树,但可以忽略性能差异
2)红黑树的插入删除比AVL树更便于控制操作
3)红黑树整体性能略优于AVL树(红黑树旋转情况少于AVL树)
自平衡原理:即在插入或者删除数据后,通过调整(左右旋转和变色),达到平衡的过程