红黑树

【深入理解Java集合框架】史上最清晰的红黑树讲解(上)
一步一图一代码,一定要让你真正彻底明白红黑树
红黑树
红黑树的C++完整实现源码
经典算法研究系列:五、红黑树算法的实现与剖析
#算法学习录#红黑树结构
彻底搞懂红黑树(二)
红黑树探索笔记

删除

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

class Node {
public:
    TreeNode* deleteNode(TreeNode* root, int key) {
        if (root == NULL) {
            return NULL;
        }
        if (key < root->val) {
            root->left = deleteNode(root->left, key);
        }
        else if (key > root->val) {
            root->right = deleteNode(root->right, key);
        }
        /* Cur node has to be deleted, handle 3 cases below */
        else {
            TreeNode * oldroot = root;
            // single or no child case.等价于 if (!root->left || !root->right) root = (!root->left) ? root->right : root->left;
            if (root->left == NULL) {
                return root->right;
            }
            else if (root->right == NULL) {
                return root->left;
            }
            /* Find smallest in right sub-tree, copy its val and delete it */
            else {
                TreeNode *minNode = findMin(root->right);
                root->val = minNode->val; /* curval = smallest in right subtree */
                root->right = deleteNode(root->right, root->val);
                /* next will already be deleted, nothing to del in this case */
                oldroot = NULL;
            }
            delete oldroot;
        }
        return root;
    }
private:
    /* Find the left-most node in the tree     */
    inline TreeNode *findMin(TreeNode *node) {
        while (node->left != NULL) {
            node = node->left;
        }
        return node;
    }
};
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

class Node {
public:
    TreeNode *deleteNode(TreeNode* root, int key) {
        if (root == NULL) {
            return NULL;
        }
        if (key < root->val) {          //key在左半树上
            root->left = deleteNode(root->left, key);
        }
        else if (key > root->val) {     //key在右半树上
            root->right = deleteNode(root->right, key);
        }
        else {                          //当root->val等于NULL时,删除root
            TreeNode * oldroot = root;
            if (root->left == NULL) {
                return root->right;
            }
            else if (root->right == NULL) {
                return root->left;
            }
            else {      //we can chose root->left or root->right to be the new root in case it is not NULL.
                TreeNode *minNode = findMin(root->right);
                root->val = minNode->val;
                root->right = deleteNode(root->right, root->val);
                oldroot = NULL;
            }
            delete oldroot;
        }
        return root;
    }
private:
    TreeNode *findMin(TreeNode *node) {
        while (node->left != NULL) {
            node = node->left;
        }
        return node;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 树(tree)的基本知识 一.定义 树是一种抽象数据类型,或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构...
    337b94dc718f阅读 7,316评论 3 42
  • 上一篇:Java集合-ConcurrentHashMap工作原理和实现JDK8 本文学习知识点 1、二叉查找树,以...
    Misout阅读 13,930评论 9 67
  • 1、红黑树介绍 红黑树又称R-B Tree,全称是Red-Black Tree,它是一种特殊的二叉查找树,红黑树的...
    文哥的学习日记阅读 9,943评论 1 35
  • 原文链接 二叉查找树 由于红黑树本质上就是一棵二叉查找树,所以在了解红黑树之前,咱们先来看下二叉查找树。 二叉查找...
    非典型程序员阅读 2,854评论 2 5
  • 阅读,是了解这个世界的窗口。所以,我手机也是安装了各种内容型的应用,诸如:好奇心日报,知乎日报,界面新闻,虎嗅,3...
    WesleyHi阅读 712评论 0 0