紅黑樹的簡單實(shí)現(xiàn)(java)

最近研究紅黑樹笋籽,簡單的實(shí)現(xiàn)了一個java的紅黑樹代碼椭员,親測沒有問題,相關(guān)實(shí)現(xiàn)的說明都在注釋中侍芝。
實(shí)現(xiàn)時遇到的坑:
實(shí)現(xiàn)的時候遇到的坑出現(xiàn)在紅黑樹的刪除階段埋同,網(wǎng)上各種資料都是說刪除的時候按照二叉查找樹進(jìn)行刪除就好了凶赁,結(jié)果這塊在進(jìn)行紅黑樹平衡的時候,待刪除的節(jié)點(diǎn)是誰致板,替換的節(jié)點(diǎn)是誰很容易搞混咏窿,下面代碼在寫刪除這塊代碼的時候特意標(biāo)明了待刪除節(jié)點(diǎn)和替換的節(jié)點(diǎn)是誰,便于在看原理的時候可以更好的理解萝挤。

/**
 * Created by xiaosong on 2017/12/27.
 * 紅黑樹的簡單實(shí)現(xiàn)
 * 紅黑樹的特性:
 * (1)每個節(jié)點(diǎn)或者是黑色怜珍,或者是紅色凤粗。
 * (2)根節(jié)點(diǎn)是黑色。
 * (3)每個葉子節(jié)點(diǎn)(NIL)是黑色揭璃。 [注意:這里葉子節(jié)點(diǎn)亭罪,是指為空(NIL或NULL)的葉子節(jié)點(diǎn)!]
 * (4)如果一個節(jié)點(diǎn)是紅色的情组,則它的子節(jié)點(diǎn)必須是黑色的。
 * (5)從一個節(jié)點(diǎn)到該節(jié)點(diǎn)的子孫節(jié)點(diǎn)的所有路徑上包含相同數(shù)目的黑節(jié)點(diǎn)肆氓。
 */

public class RBTree<T> {
    public static class TreeNode<T> {
        private T data;//數(shù)據(jù)值
        private TreeNode<T> left;
        private TreeNode<T> right;
        private TreeNode<T> parent;
        private Color color;
        private int value;//數(shù)據(jù)的權(quán)重

        public T getData() {
            return data;
        }

        public void setData(T data) {
            this.data = data;
        }

        public int getValue() {
            return value;
        }

        public void setValue(int value) {
            this.value = value;
        }
    }

    enum Color {
        BLACK, RED
    }

    private TreeNode<T> root;

    /**
     * 插入節(jié)點(diǎn)
     * 首先將該節(jié)點(diǎn)以二叉平衡樹的方式插入到相應(yīng)位置谢揪,然后使其滿足紅黑樹的性質(zhì)
     *
     * @param node
     */
    public void insert(TreeNode<T> node) {
        if (root == null) {//樹中無元素捐凭,則將插入元素當(dāng)做根結(jié)點(diǎn)
            root = node;
            root.parent = null;
            root.left = null;
            root.right = null;
            root.color = Color.BLACK;//根節(jié)點(diǎn)必是黑色
            return;
        }
        //按二叉查找樹的方式將該節(jié)點(diǎn)插入
        TreeNode<T> comNode = root;
        while (comNode != null) {
            if (comNode.value >= node.value) {
                if (comNode.left == null) {
                    comNode.left = node;
                    break;
                } else {
                    comNode = comNode.left;
                }
            } else {
                if (comNode.right == null) {
                    comNode.right = node;
                    break;
                } else {
                    comNode = comNode.right;
                }
            }
        }
        node.parent = comNode;
        node.color = Color.RED;//當(dāng)前新插入且非根節(jié)點(diǎn)初始必為紅色
        node.left = null;
        node.right = null;
        doAddBalance(node);//插入節(jié)點(diǎn)后茁肠,將紅黑樹進(jìn)行變換垦梆,使其繼續(xù)符合紅黑樹的性質(zhì)
    }

    /**
     * 刪除節(jié)點(diǎn)
     *
     * @param node
     */
    public void delete(TreeNode<T> node) {
        delete(node.value);
    }

    public void delete(int value) {
        //找到要刪除的節(jié)點(diǎn)
        TreeNode<T> needDelete = null;
        TreeNode<T> currentNode = root;
        while (currentNode != null) {
            if (currentNode.value == value) {
                needDelete = currentNode;
                break;
            } else if (currentNode.value > value) {
                currentNode = currentNode.left;
            } else {
                currentNode = currentNode.right;
            }
        }
        if (needDelete != null) {
            doDelete(needDelete);
        }
    }

    /**
     * 添加時進(jìn)行的紅黑樹性質(zhì)匹配操作
     *
     * @param node
     */
    private void doAddBalance(TreeNode<T> node) {
        TreeNode<T> currentNode = node;
        TreeNode<T> grandP;
        TreeNode<T> uncle;
        while (currentNode.parent != null && currentNode.parent.color == Color.RED) {//當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)為紅色或當(dāng)前節(jié)點(diǎn)為根節(jié)點(diǎn)
            grandP = currentNode.parent.parent;
            if (grandP.left == currentNode.parent) {//當(dāng)前節(jié)點(diǎn)的祖父節(jié)點(diǎn)的左孩子是當(dāng)前節(jié)點(diǎn)的父親節(jié)點(diǎn)
                uncle = currentNode.parent.parent.right;//叔叔節(jié)點(diǎn)
                if (uncle == null || uncle.color == Color.BLACK) {//叔叔節(jié)點(diǎn)是黑色
                    if (currentNode.parent.right == currentNode) {//當(dāng)前節(jié)點(diǎn)是右孩子
                        currentNode = currentNode.parent;//以當(dāng)前節(jié)點(diǎn)父親節(jié)點(diǎn)為新的當(dāng)前節(jié)點(diǎn)
                        leftRotate(currentNode);//對新的當(dāng)前節(jié)點(diǎn)進(jìn)行左旋
                    } else if (currentNode.parent.left == currentNode) {//當(dāng)前節(jié)點(diǎn)是左孩子
                        currentNode.parent.color = Color.BLACK;//將當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)設(shè)置為黑色
                        grandP.color = Color.RED;//將當(dāng)前節(jié)點(diǎn)的祖父節(jié)點(diǎn)設(shè)置為紅色
                        rightRotate(grandP);//對當(dāng)前節(jié)點(diǎn)的祖父節(jié)點(diǎn)進(jìn)行右旋
                    }
                } else {//叔叔節(jié)點(diǎn)是紅色
//                    (01) 將“父節(jié)點(diǎn)”設(shè)為黑色托猩。
                    currentNode.parent.color = Color.BLACK;
//                    (02) 將“叔叔節(jié)點(diǎn)”設(shè)為黑色站刑。
                    uncle.color = Color.BLACK;
//                    (03) 如果祖父節(jié)點(diǎn)不是根節(jié)點(diǎn),將“祖父節(jié)點(diǎn)”設(shè)為“紅色”摆尝。
                    if (grandP.parent != null) {
                        grandP.color = Color.RED;
                    }
//                    (04) 將“祖父節(jié)點(diǎn)”設(shè)為“當(dāng)前節(jié)點(diǎn)”(紅色節(jié)點(diǎn))因悲;
                    currentNode = grandP;
                }
            } else if (grandP.right == currentNode.parent) {//當(dāng)前節(jié)點(diǎn)的祖父節(jié)點(diǎn)的右孩子是當(dāng)前節(jié)點(diǎn)的父親節(jié)點(diǎn)
                uncle = currentNode.parent.parent.left;//叔叔節(jié)點(diǎn)
                if (uncle == null || uncle.color == Color.BLACK) {//叔叔節(jié)點(diǎn)是黑色
                    if (grandP.right == currentNode.parent) {//當(dāng)前節(jié)點(diǎn)的祖父節(jié)點(diǎn)的右孩子是當(dāng)前節(jié)點(diǎn)的父親節(jié)點(diǎn)
                        if (currentNode.parent.left == currentNode) {//當(dāng)前節(jié)點(diǎn)是左孩子
                            currentNode = currentNode.parent;//以當(dāng)前節(jié)點(diǎn)父親節(jié)點(diǎn)為新的當(dāng)前節(jié)點(diǎn)
                            rightRotate(currentNode);//對新的當(dāng)前節(jié)點(diǎn)進(jìn)行右旋
                        } else if (currentNode.parent.right == currentNode) {//當(dāng)前節(jié)點(diǎn)是右孩子
                            currentNode.parent.color = Color.BLACK;//將當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)設(shè)置為黑色
                            grandP.color = Color.RED;//將當(dāng)前節(jié)點(diǎn)的祖父節(jié)點(diǎn)設(shè)置為紅色
                            leftRotate(grandP);//對當(dāng)前節(jié)點(diǎn)的祖父節(jié)點(diǎn)進(jìn)行左旋
                        }
                    }
                } else {//叔叔節(jié)點(diǎn)是紅色
                    //同上邊處理方式相同
                    currentNode.parent.color = Color.BLACK;
                    uncle.color = Color.BLACK;
                    if (grandP.parent != null) {
                        grandP.color = Color.RED;
                    }
                    currentNode = grandP;
                }
            }
        }
    }

    /**
     * 刪除時進(jìn)行的紅黑樹性質(zhì)匹配操作
     *
     * @param node
     */
    public void doDeleteBalance(TreeNode<T> node) {
        TreeNode<T> currentNode = node;
        while (currentNode != null) {
            if (currentNode.color == Color.RED) {//當(dāng)前節(jié)點(diǎn)為紅色晃琳,直接涂黑處理
                currentNode.color = Color.BLACK;
                return;
            } else {//當(dāng)前節(jié)點(diǎn)為黑色卫旱,需要分情況處理
                if (currentNode.parent == null) return;//根節(jié)點(diǎn),不做處理
                TreeNode<T> brother;//當(dāng)前節(jié)點(diǎn)的兄弟節(jié)點(diǎn)
                brother = getBrother(currentNode);//獲取當(dāng)前節(jié)點(diǎn)的兄弟節(jié)點(diǎn)
                if (node.parent.left == node) {//被刪節(jié)點(diǎn)是其父節(jié)點(diǎn)的左孩子
                    if (brother.color == Color.RED) {//若當(dāng)前節(jié)點(diǎn)的兄弟節(jié)點(diǎn)為紅色
                        currentNode.parent.color = Color.RED;//將當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)變?yōu)榧t色
                        brother.color = Color.BLACK;//將當(dāng)前節(jié)點(diǎn)的兄弟節(jié)點(diǎn)置黑
                        leftRotate(currentNode.parent);//將當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)左旋
                    } else if (brother.color == Color.BLACK) {//若當(dāng)前節(jié)點(diǎn)的兄弟節(jié)點(diǎn)為黑色
                        if ((brother.left == null || brother.left.color == Color.BLACK) && (brother.right == null || brother.right.color == Color.BLACK)) {//兄弟節(jié)點(diǎn)的左右孩子都是黑色
                            brother.color = Color.RED;//當(dāng)前節(jié)點(diǎn)的兄弟節(jié)點(diǎn)顏色變?yōu)榧t色
                            currentNode = currentNode.parent;//將父節(jié)點(diǎn)設(shè)置為當(dāng)前節(jié)點(diǎn)
                        } else if (brother.right != null && brother.right.color == Color.RED) {//兄弟節(jié)點(diǎn)的右孩子是紅色
                            brother.color = currentNode.parent.color;//將兄弟節(jié)點(diǎn)顏色置為當(dāng)前節(jié)點(diǎn)父節(jié)點(diǎn)顏色
                            currentNode.parent.color = Color.BLACK;//當(dāng)前節(jié)點(diǎn)父節(jié)點(diǎn)置黑
                            brother.right.color = Color.BLACK;//兄弟節(jié)點(diǎn)右孩子置黑
                            leftRotate(currentNode.parent);//以當(dāng)前節(jié)點(diǎn)父節(jié)點(diǎn)為支點(diǎn)左旋
                            return;
                        } else if ((brother.left != null && brother.left.color == Color.RED) && (brother.right == null || brother.right.color == Color.BLACK)) {//兄弟節(jié)點(diǎn)的左孩子是紅色,右孩子是黑色
                            brother.left.color = Color.BLACK;//將兄弟節(jié)點(diǎn)的左孩子變?yōu)楹谏?                            brother.color = Color.RED;//兄弟節(jié)點(diǎn)變?yōu)榧t色
                            rightRotate(brother);//將兄弟節(jié)點(diǎn)右旋
                        }
                    }
                } else if (node.parent.right == node) {//被刪節(jié)點(diǎn)是其父節(jié)點(diǎn)的右孩子
                    if (brother.color == Color.RED) {//若當(dāng)前節(jié)點(diǎn)的兄弟節(jié)點(diǎn)為紅色
                        currentNode.parent.color = Color.RED;//將當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)變?yōu)榧t色
                        brother.color = Color.BLACK;//將當(dāng)前節(jié)點(diǎn)的兄弟節(jié)點(diǎn)置黑
                        rightRotate(currentNode.parent);//將當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)右旋
                    } else if (brother.color == Color.BLACK) {//若當(dāng)前節(jié)點(diǎn)的兄弟節(jié)點(diǎn)為黑色
                        if ((brother.left == null || brother.left.color == Color.BLACK) && (brother.right == null || brother.right.color == Color.BLACK)) {//兄弟節(jié)點(diǎn)的左右孩子都是黑色
                            brother.color = Color.RED;//當(dāng)前節(jié)點(diǎn)的兄弟節(jié)點(diǎn)顏色變?yōu)榧t色
                            currentNode = currentNode.parent;//將父節(jié)點(diǎn)設(shè)置為當(dāng)前節(jié)點(diǎn)
                        } else if (brother.left != null && brother.left.color == Color.RED) {//兄弟節(jié)點(diǎn)的左孩子是紅色
                            brother.color = currentNode.parent.color;//將兄弟節(jié)點(diǎn)顏色置為當(dāng)前節(jié)點(diǎn)父節(jié)點(diǎn)顏色
                            currentNode.parent.color = Color.BLACK;//當(dāng)前節(jié)點(diǎn)父節(jié)點(diǎn)置黑
                            brother.left.color = Color.BLACK;//兄弟節(jié)點(diǎn)左孩子置黑
                            rightRotate(currentNode.parent);//以當(dāng)前節(jié)點(diǎn)父節(jié)點(diǎn)為支點(diǎn)右旋
                            return;
                        } else if ((brother.right != null && brother.right.color == Color.RED) && (brother.left == null || brother.left.color == Color.BLACK)) {//兄弟節(jié)點(diǎn)的右孩子是紅色涝桅,左孩子是黑色
                            brother.right.color = Color.BLACK;//將兄弟節(jié)點(diǎn)的右孩子變?yōu)楹谏?                            brother.color = Color.RED;//兄弟節(jié)點(diǎn)變?yōu)榧t色
                            leftRotate(brother);//將兄弟節(jié)點(diǎn)右旋
                        }
                    }
                }
            }
        }
    }

    public TreeNode<T> getBrother(TreeNode<T> node) {//獲取當(dāng)前節(jié)點(diǎn)的兄弟節(jié)點(diǎn)
        if (node.parent.left != node) {//重新設(shè)置X的兄弟節(jié)點(diǎn)
            return node.parent.left;
        } else {
            return node.parent.right;
        }
    }


    private void doDelete(TreeNode<T> node) {
        TreeNode<T> currentNode;//要替換的節(jié)點(diǎn)
        TreeNode<T> needDelete = node;//要刪除的節(jié)點(diǎn)
        //先進(jìn)行二叉排序樹的刪除操作冯遂,找到要進(jìn)行替換的節(jié)點(diǎn)
        if (node.left != null && node.right != null) {//待刪除節(jié)點(diǎn)左右子樹均在
            TreeNode<T> succed = node.left;//尋找該節(jié)點(diǎn)的后繼節(jié)點(diǎn)(找左兒子的最右子樹)
            while (succed.right != null) {
                succed = succed.right;
            }
            node.value = succed.value;//將原刪除節(jié)點(diǎn)的值替換為其后繼節(jié)點(diǎn)的值谒获,將后繼節(jié)點(diǎn)作為待刪除節(jié)點(diǎn)
            node.data = succed.data;
            needDelete = succed;
        }
        currentNode = needDelete.left != null ? needDelete.left : needDelete.right;
        if (currentNode != null) {
            currentNode.parent = needDelete.parent;//刪除待刪除節(jié)點(diǎn),并用其子節(jié)點(diǎn)代替
            if (needDelete.left == currentNode) {
                currentNode.parent.left = currentNode;
            } else {
                currentNode.parent.right = currentNode;
            }
            needDelete.left = needDelete.right = needDelete.parent = null;
            if (needDelete.color == Color.BLACK) {
                doDeleteBalance(node);
            }
        } else if (needDelete.parent == null) {//說明當(dāng)前是根節(jié)點(diǎn)
            root = null;
        } else {//說明待刪除節(jié)點(diǎn)是個葉子節(jié)點(diǎn)
            currentNode = needDelete;//將自己作為替換節(jié)點(diǎn)寻定,同時自己也是待刪除節(jié)點(diǎn)
            if (needDelete.color == Color.BLACK) {
                doDeleteBalance(currentNode);
            }
            //平衡之后,將其刪除
            if (currentNode.parent != null) {
                if (currentNode.parent.left == currentNode) {
                    currentNode.parent.left = null;
                } else if (currentNode.parent.right == currentNode) {
                    currentNode.parent.right = null;
                }
                currentNode.parent = null;
            }
        }
    }

    public boolean isLeaf(TreeNode<T> node) {
        return node.left == null && node.right == null;
    }

    /**
     * 左旋操作琅锻,傳入的參數(shù)為要左旋的節(jié)點(diǎn)
     */
    private void leftRotate(TreeNode<T> des) {
        TreeNode<T> x = des;
        TreeNode<T> y = des.right;
        TreeNode<T> b = y.left;
        x.right = b;//將y的左孩子變?yōu)閤的右孩子
        if (b != null) {
            b.parent = x;
        }
        y.parent = x.parent;//將x的父親設(shè)置為y的父親
        if (x.parent == null) {//根節(jié)點(diǎn)
            root = y;
        } else {//非根節(jié)點(diǎn)
            if (x.parent.left == x) {//x是其父節(jié)點(diǎn)的左孩子
                x.parent.left = y;
            } else if (x.parent.right == x) {//x是其父節(jié)點(diǎn)的右孩子
                x.parent.right = y;
            }
        }
        x.parent = y;//將y設(shè)置成x的父親
        y.left = x;//將x設(shè)置為y的左孩子
    }

    /**
     * 右旋操作恼蓬,傳入的參數(shù)為要右旋的節(jié)點(diǎn)
     */
    private void rightRotate(TreeNode<T> des) {
        TreeNode<T> y = des;
        TreeNode<T> x = des.left;
        TreeNode<T> b = x.right;
        y.left = b;//將x的右孩子變?yōu)閥的左孩子
        if (b != null) {
            b.parent = y;
        }
        //將y的父親設(shè)置為x的父親
        x.parent = y.parent;
        if (y.parent == null) {//根節(jié)點(diǎn)
            root = x;
        } else {//非根節(jié)點(diǎn)
            if (y.parent.left == y) {//y是其父節(jié)點(diǎn)的左孩子
                y.parent.left = x;
            } else if (y.parent.right == y) {//y是其父節(jié)點(diǎn)的右孩子
                y.parent.right = x;
            }
        }
        y.parent = x;//將x設(shè)置成y的父親
        x.right = y;//將y設(shè)置為x的右孩子
    }
}

參考資料:
1.https://www.cnblogs.com/skywang12345/p/3245399.html
2.java TreeMap的源碼

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末处硬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子凿跳,更是在濱河造成了極大的恐慌疮方,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疆栏,死亡現(xiàn)場離奇詭異惫谤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)若专,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門富岳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人窖式,你說我怎么就攤上這事』绰撸” “怎么了阁簸?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵启妹,是天一觀的道長。 經(jīng)常有香客問我饶米,道長檬输,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任析命,我火速辦了婚禮逃默,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘笑旺。我一直安慰自己筒主,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布使兔。 她就那樣靜靜地躺著藤韵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪欲险。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天槐壳,我揣著相機(jī)與錄音喜每,去河邊找鬼。 笑死带兜,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的刚照。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼海诲,長吁一口氣:“原來是場噩夢啊……” “哼檩互!你這毒婦竟也來了咨演?” 一聲冷哼從身側(cè)響起薄风,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎循诉,沒想到半個月后撇他,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡划纽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年勇劣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片比默。...
    茶點(diǎn)故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡命咐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出侈百,到底是詐尸還是另有隱情,我是刑警寧澤讽坏,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布路呜,位于F島的核電站织咧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏笙蒙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一轧葛、第九天 我趴在偏房一處隱蔽的房頂上張望艇搀。 院中可真熱鬧,春花似錦衷笋、人聲如沸矩屁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽郭膛。三九已至,卻和暖如春耘柱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背调煎。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工士袄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寓辱。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓赤拒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親挎挖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 紅黑樹是平衡二叉查找樹的一種崔涂。為了深入理解紅黑樹墓造,我們需要從二叉查找樹開始講起。 BST 二叉查找樹(Binary...
    kanehe閱讀 1,370評論 0 8
  • 樹的概述 樹是一種非常常用的數(shù)據(jù)結(jié)構(gòu),樹與前面介紹的線性表蛉拙,棧彻亲,隊(duì)列等線性結(jié)構(gòu)不同,樹是一種非線性結(jié)構(gòu) 1.樹的定...
    Jack921閱讀 4,442評論 1 31
  • 周三買的百合開來了一朵其他的都還是花骨朵轴脐。周六加班的那天開了四朵了。過了周天只有一天的周末大咱。大概是講好每周一買花碴巾,...
    梵谷臉譜閱讀 516評論 0 50
  • 俗話說的好,男怕入錯行提揍,女怕嫁錯郎煮仇。對于后者的理解顯而易見,但是對于前者欺抗,就在我踏入職場的那一瞬,我恍然間領(lǐng)悟了贸人。...
    everfight閱讀 497評論 3 6
  • 今天看見小伙伴們開始發(fā)總結(jié)復(fù)盤佃声,才驚覺五月有這樣悄悄溜走了!今天我也來對自己的五月做一下復(fù)盤吧十拣! 一志鹃、關(guān)于微商 五...
    萵是秀秀閱讀 460評論 0 0