我的256天 创作纪念日

机缘

最初成为创作者的初心其实就是来输出知识的,去年我还很在意粉丝的数量,但是现在我更在意的是自己的知识和技术水平有没有得到提升,我现在在意的不是博客的数量,而是博客的质量,只有追求质量,才能让自己得到成长,同时也能为读者提供更加优质的文章,我觉得这才是最重要的,并且我写博客的时候,其实在思考该如何将知识更好的输出给读者,而不是自己会了就行,而是站在读者的角度去构思文章,尽量让每一位读者在我的文章中收获一些知识,所以我创作的时候,经常会考虑哪些东西要细一些,所以有时候文章会经常破一万字。
创作其实对于我来说也是学习的一部分,我的博客也其实就是我的笔记,所以我从一开始到现在甚至在未来,都会认真地提供更好的优质文章。


收获

目前有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领域的新星创作者。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值