机缘
最初成为创作者的初心其实就是来输出知识的,去年我还很在意粉丝的数量,但是现在我更在意的是自己的知识和技术水平有没有得到提升,我现在在意的不是博客的数量,而是博客的质量,只有追求质量,才能让自己得到成长,同时也能为读者提供更加优质的文章,我觉得这才是最重要的,并且我写博客的时候,其实在思考该如何将知识更好的输出给读者,而不是自己会了就行,而是站在读者的角度去构思文章,尽量让每一位读者在我的文章中收获一些知识,所以我创作的时候,经常会考虑哪些东西要细一些,所以有时候文章会经常破一万字。
创作其实对于我来说也是学习的一部分,我的博客也其实就是我的笔记,所以我从一开始到现在甚至在未来,都会认真地提供更好的优质文章。
收获
目前有1223 名粉丝,我感觉很高兴,有59篇技术博客,排名3875,总访问量有八万七。
日常
作为一名准大二的学生,我的学习和创作是息息相关的,学习是为了学到新的知识和技术,创作是为了输出自己的知识,二者相辅相成,相互补充的关系。
成就
其实也没什么很大的成就,毕竟自己还是一个准大二的学生,目前正在高阶数据结构摸爬滚打中,还有算法需要学习,同时也在学习MySQL 数据的知识,要说有什么特别的成就,那就是自己能手撕AVL 树的插入代码,左旋,右旋,左右双旋,右左双旋,感觉也不是什么成就,但是我很高兴,接下来要手撕红黑树了。
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode parent;
int bf; //平衡因子 右子树高度减去左子树高度
public TreeNode(int val) {
this.val = val;
}
}
public class AVLTree {
public TreeNode root;
public boolean insert(int val) {
TreeNode node = new TreeNode(val);
//如果根节点本身为空就直接赋值
if(root == null) {
root = node;
return true;
}
TreeNode prev = null;
TreeNode cur = root;
//找到新结点的位置
while(cur != null) {
if(cur.val == val) {
//相同的数据无法再次插入
return false;
} else if(cur.val < val) {
prev = cur;
cur = cur.right;
} else {
prev = cur;
cur = cur.left;
}
}
//插入结点
if(prev.val > val) {
prev.left = node;
} else {
prev.right = node;
}
node.parent = prev;
cur = node;
//调整平衡因子与AVL树
while(prev != null) {
//左子树-- 右子树++
if(prev.left == cur) {
prev.bf--;
} else {
prev.bf++;
}
//检查是否需要旋转
if(prev.bf == 0) {
//平衡因子为0,说明树已经平衡,不用调整
break;
} else if(prev.bf == -1 || prev.bf == 1) {
//如果出现 -1 或者 1 则说明树的平衡性已经被新结点影响到,需要继续调整
cur = prev;
prev = prev.parent;
} else {
//此时怕平衡因子有两种情况2 或者 -2,需要旋转重新建立平衡树
if(prev.bf == 2) {
//说明右子树过高
if(cur.bf == 1) {
//右右型 左单旋
rotateLeft(prev);
} else if(cur.bf == -1) {
//右左型 右左双旋
rotateRL(prev);
}
} else {
//此时 prev.bf == -2 说明左子树过高
if(cur.bf == 1) {
//左右型,左右双旋
rotateLR(prev);
} else if(cur.bf == -1) {
//左左型, 右单旋
rotateRight(prev);
}
}
//旋转完成后,树已经平衡,直接退出循环
break;
}
}
return true;
}
//左右双旋
private void rotateLR(TreeNode prev) {
TreeNode cur = prev.left;
TreeNode curR = cur.right;
int bf = curR.bf;
rotateLeft(cur);
rotateRight(prev);
//调整平衡因子
if(bf == 1) {
cur.bf = -1;
} else if(bf == -1) {
prev.bf = 1;
}
//bf 为 0 的时候,不需要调整
}
//右左双旋
private void rotateRL(TreeNode prev) {
TreeNode cur = prev.right;
TreeNode curL = cur.left;
int bf = curL.bf;
rotateRight(cur);
rotateLeft(prev);
//调整平衡因子
if(bf == 1) {
prev.bf = -1;
} else if(bf == -1) {
cur.bf = 1;
}
//bf 为 0 的时候,不需要调整
}
//右单旋
private void rotateRight(TreeNode prev) {
TreeNode pParent = prev.parent;
TreeNode cur = prev.left;
TreeNode curR = cur.right;
prev.left = curR;
if(curR != null) {
curR.parent = prev;
}
cur.right = prev;
prev.parent = cur;
cur.parent = pParent;
if(prev == root) {
root = cur;
} else if(pParent.left == prev) {
pParent.left = cur;
} else {
pParent.right = cur;
}
//调整平衡因子
cur.bf = prev.bf = 0;
}
//左单旋
private void rotateLeft(TreeNode prev) {
TreeNode pParent = prev.parent;
TreeNode cur = prev.right;
TreeNode curL = cur.left;
prev.right = curL;
if(curL != null) {
curL.parent = prev;
}
cur.left = prev;
prev.parent = cur;
cur.parent = pParent;
if(prev == root) {
root = cur;
} else if(pParent.left == prev) {
pParent.left = cur;
} else {
pParent.right = cur;
}
//调整平衡因子
cur.bf = prev.bf = 0;
}
}
憧憬
我其实挺喜欢做一些东西,自从进入计算机领域,我就对软件的制造充满无限的兴趣,感觉回到儿时的时光,自己动手做东西对于我来说是一件特别右成就感的时候,所以我未来是更倾向于后端开发的工作,希望能将自己学到的知识在工作中绽放出烟花。
也十分感谢 CSDN 提供的平台,让我能在这里输出我学到的知识,更好地巩固知识,在未来的学习中,我也会不断创作,将自己对知识的理解输出成一篇又一篇的博客,同时我也希望能获得更多的粉丝,看到自己每日增加的粉丝,心里还是很高兴的,我下一个目标就是两千粉丝,然后认证为Java领域的新星创作者。