1.聊聊树
树得基本特性
1.每个结点有多个或者零个子结点
2.没有父结点的结点就是根结点(就是老大),没有子结点就是叶结点(最小的小弟)
3.每一个非根结点只有一个父结点(就是上面这个人)
我的个人理解 就是A就是根节点也是Boss,BCD(非跟结点)就是帮助头上大哥管理小弟,本来很潇洒,但它头上还有一个大哥。KLHIJ就是最小的小弟也叫叶结点
2.关于二叉树的规则
1.二叉树就是度不超过2的树,其每个结点最多有两个子结点
2.二叉树的结点分为左结点和右结点,假如没有右节点,也要分左右结点
有人要问了:为啥B结点下面的子结点只有一个,为什么不像右结点有两个,因为BC结点下面的子结点都是两个的话 那这就是下面的满二叉树了
3.关于满二叉树的规则
1.二叉树的每一层的结点度都达到最大值,就是有两个子结点,则这个二叉树就是满二叉树
2.一棵深度为n的满二叉树,有2^n-1个结点
4.关于完全二叉树
对一棵具有n个结点的二叉树按层序排号,如果编号为i的结点与同样深度的满二叉树编号为i结点在二叉树中位置完全相同,就是完全二叉树。
可以理解为结点或者叶子结点是按顺序来的树,但无不能有缺失
例如 从 1到10的排序 其中少了1,2个数字 者就不是完全二叉树
树1,按层次编号5结点没有左子树,有右子树,10结点缺失。树2由于3结点没有字数,是的6,7位置空挡了。树3中结点5没有子树。 就像我说的 他们缺少了结点树,所以不是完全二叉树
这就是一个完全二叉树
5.红黑树满足的规则
1.根结点必须是黑色的
2.每个红色节点的两个子节点都是黑色。( 即: 不能有两个连续的红色节点 )
3.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点
关于红黑树的变色以及左自旋以及右自旋的讲解
1.首先我们要知道 每次新插入的元素结点是为红色的
2.上面规则也说了 :不能有两个连续的红色结点
我们先看正常的红黑树 不需要自旋的时候
关于红黑树的变色以及自旋
1.我们插入6这个元素时,发现它的父结点7是红色,不满足规则。这里就判断是需要变色还是自旋
它的父结点7是红色,叔结点13也是红色,我们就需要先变色处理,(如果叔结点是黑色,我们就需要自旋,后面步骤)把父结点7和叔结点13变为黑色,把祖结点变为红色,如下图
2.我们发现祖结点12与它的上结点5冲突了,我们考虑是变色还是自旋,我们发现结点12它的父结点是5,但叔叔结点1是黑色,并且以结点12为跟结点的子树是结点5的右子树,符合自旋的情况,以结点5进行左旋(如果说是左子树,就进行右旋)
我们左旋之后得到上图,发现当前结点5与它的父结点12冲突了,且叔叔13结点为黑色,开始右旋上面说过(怎么看左旋与右旋) ,得到下图
6.红黑树总结
首先是规则
1、每个节点都有红色或黑色
2、树的根始终是黑色的
3、没有两个相邻的红色节点
4、从节点(包括根)到其任何后代NULL节点(就是叶子结点下方挂的两个空节点),
这么简单来理解变色与自旋吧
首先我们插入一个元素,绝对是红色的,这个是绝对的,不可能为黑色,除非你自己改源码。
我们能去找它的父级 看是什么颜色的,还要看上面的叔结点是什么颜色的,如果父结点与叔结点都是红色,则先需要变色,如果父结点为黑色,就不需要变色自旋,如果父结点是红色,叔结点是黑色,我们就需要自旋。其实吧这就是一层一层往上面套娃的形式。