理念:只要你把事情分的足够简单,系统就不会出错。
一、总览:首先我们来看一下一颗简单的树是什么结构。
二、节点:很明显,一颗树是由一个个简单的节点组成的,所以要想搞清红黑树,首先熟悉最简单的节点。
为了简化便于理解,每个节点的值用int格式。
红黑树节点的组成:值、左孩子、右孩子、父节点、颜色。用java代码表示如下:
class RBNode{
int value;
boolean color;//true = 黑,false = 红
RBNode farther;
RBNode left;
RBNode right;
}
三、明白了单个节点的结构,我们学习一下树的插入。
1、找到合适的节点
2、当前值比节点小且节点左节点为空,插入左孩子位置,反之插入右孩子位置,前提是孩子为空。
找孩子我们代码用递归的思想去做,首先找的是根节点,在类中是个全局变量root。java代码实现如下。
public void put(int value){
if(root == null) {
root = new RBNode(value, true, null, null, null);
}else {
putNode(root,value);
}
}
private void putNode(RBNode node,int value){
if(value < node.value){//1、比node小
if(node.left == null){//1.1、 左孩子空,放入左孩子
RBNode newNode = new RBNode(value, RED, node, null, null);
node.left = newNode;
return;
}else {//1.2、 左孩子不为空,递归左孩子
putNode(node.left,value);
}
}else {//2、比node大
if(node.right == null){// 2.1、右孩子为空,放入右孩子
RBNode newNode = new RBNode(value, RED, node, null, null);
node.right = newNode;
return;
}else {//2.2 右孩子不为空,递归右孩子
putNode(node.right,value);
}
}
}
四、上面学会了,只能建立一个简单二叉树,不是平衡的,要想要树平衡,首先要学两个规则,左旋和右旋。
左旋:把一个节点看成一个三角形,左旋就是向左旋转(逆时针),就是下图中 5 替代 2 的位置。
左旋官话:右节点替代根节点,根节点变为右节点的左节点,右节点的左节点变为根节点的右节点(绕的一比)。
左旋分两步:1、5替代2的位置(根节点2往左旋,右孩子5上位替代自己的位置)。
2、5的左孩子变为2的右孩子(2上位当老大,左孩子4不要,扔给退位的老大2来收养)。
注意:旋转是指根节点旋转,即主角是2,针对2来说的。
左旋后
本文介绍了红黑树的基本概念,包括节点结构、插入操作、左旋、右旋规则以及红黑树的平衡策略。通过Java代码展示了插入节点时如何进行旋转和变色,解释了为何进行这些操作以保持树的平衡,并探讨了红黑树的设计理解。
最低0.47元/天 解锁文章
815

被折叠的 条评论
为什么被折叠?



