public void redBlackTreeInsertFixUp(Node z)
    {
        /**
         * 父节点的color是红色才有必要进行调整
         * 根据红黑树的特性，有如下几种场景需要调整
         * case1: 前提:z节点是red，p(z)也是red,此时p(p(z))肯定是black
         *        假设p(z)是p(p(z))的左子树
         *        那么右子树的节点能否是黑色呢？假设是黑色，可以想象一下此刻的树结构
         *        在没有插入新节点前，p(p(z))到叶节点路径上的黑色节点数量就不相等了。
         *        所以右子树的根节点肯定是红色的。
         *        综上所述，case1的情况如下:z节点是red，p(z)也是red,此时p(p(z))肯定是black，p(p(z))的右子树的节点是red,用y表示右子树根节点
         *        这种情况下的调整方案:将p(z)的color设置为black,y的color设置为black,p(p(z))的颜色设置为red,这么调整的目的是保持原有的路径黑色节点数量，同时不违反red节点下都是黑节点
         *        如此调整后，将z指向p(p(z)),既然已经将z的color设置为red了，那么z的父节点是否为red(还是属性4),黑色的话就不用管，red的话就会有第二种场景case2。
         * case2: 经过case1的调整，z指向了新的节点,可以画图看看,如果p(z)的color是red,就需要调整了。
         *        此时，z是red,p(z)是red，那么p(p(z))肯定是black。
         *        假设p(z)是p(p(z))的左子树，那么y为p(p(z))的右子树，如果y的color是red，那么就和场景1一致了，继续采用case1的算法进行调整，
         *        所以case2的情况应该是这样的：z是red,p(z)是red,p(p(z))是black,y是black.
         */
        while (z.getParent().getColor().equals(RedBlack.RED.getValue()))
        {
            Node zParent = z.getParent();
            Node zGrandPa = zParent.getParent();
            if (zParent == zGrandPa.getLeft())
            {
                //y指向祖父节点的右节点
                Node y = zGrandPa.getRight();
                if (y.getColor().equals(RedBlack.RED.getValue()))
                {
                    //场景1出来了
                    //父节点设置为black,祖父节点设置为red,父节点的兄弟节点设置为black
                    zParent.setColor(RedBlack.BLACK.getValue());
                    y.setColor(RedBlack.BLACK.getValue());
                    zGrandPa.setColor(RedBlack.RED.getValue());
                    
                    //z指针上移，指向祖父节点
                    z = zGrandPa;
                }
                else if (z == zParent.getRight())
                {
                    //case2出现了
                    z = zParent;
                    //左旋
                    leftNotationTree(z);
                }
                else
                {
                    //case3场景
                    zParent.setColor(RedBlack.BLACK.getValue());
                    zParent.setColor(RedBlack.RED.getValue());
                    rightNotationTree(zGrandPa);
                }
            }
            else
            {
                //同左树的算法，调换left和right即可
            }
        }
    }