{"id":2128,"date":"2024-07-20T20:43:31","date_gmt":"2024-07-20T20:43:31","guid":{"rendered":"https:\/\/www.w3computing.com\/articles\/?p=2128"},"modified":"2024-07-20T20:43:36","modified_gmt":"2024-07-20T20:43:36","slug":"how-to-implement-a-red-black-tree-in-cpp","status":"publish","type":"post","link":"https:\/\/www.w3computing.com\/articles\/how-to-implement-a-red-black-tree-in-cpp\/","title":{"rendered":"How to Implement a Red-Black Tree in C++"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Implementing a Red-Black Tree in C++ requires a good understanding of data structures, algorithms, and the specific properties that make Red-Black Trees efficient for various operations. In this tutorial, we will cover everything from the fundamental concepts to the complete implementation of a Red-Black Tree in C++.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction to Red-Black Trees<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A Red-Black Tree is a type of self-balancing binary search tree. Each node in the tree contains an extra bit for storing the color of the node, which can be either red or black. This color bit is used to ensure the tree remains approximately balanced during insertions and deletions. The balancing of the tree ensures that the operations such as insert, delete, and find can be performed in O(log n) time.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Properties of Red-Black Trees<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A Red-Black Tree must satisfy the following properties:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Root Property<\/strong>: The root is black.<\/li>\n\n\n\n<li><strong>Red Property<\/strong>: Red nodes cannot have red children (no two consecutive red nodes on any path).<\/li>\n\n\n\n<li><strong>Black Property<\/strong>: Every path from a node to its descendant null nodes has the same number of black nodes.<\/li>\n\n\n\n<li><strong>Depth Property<\/strong>: The depth of any path from the root to a leaf is no more than twice the depth of any other path.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">These properties ensure that the tree remains balanced, and thus operations remain efficient.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Red-Black Tree Operations<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The primary operations we need to implement for a Red-Black Tree are:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Insertion<\/strong>: Adding a new node to the tree.<\/li>\n\n\n\n<li><strong>Deletion<\/strong>: Removing an existing node from the tree.<\/li>\n\n\n\n<li><strong>Search<\/strong>: Finding a node with a given value.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Before diving into the code, let&#8217;s discuss how these operations are handled in a Red-Black Tree.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Insertion<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Inserting a node in a Red-Black Tree involves the following steps:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Perform a standard BST insert.<\/li>\n\n\n\n<li>Color the new node red.<\/li>\n\n\n\n<li>Fix the tree to maintain the Red-Black properties by performing necessary rotations and recoloring.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Deletion<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Deleting a node from a Red-Black Tree involves:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Perform a standard BST delete.<\/li>\n\n\n\n<li>Fix the tree to maintain the Red-Black properties by performing necessary rotations and recoloring.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Search<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Searching in a Red-Black Tree is similar to searching in a Binary Search Tree. It involves comparing the target value with the current node&#8217;s value and recursively searching in the left or right subtree.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Implementation in C++<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s start with the implementation. We will define the structure for the nodes first, followed by the Red-Black Tree class that will include methods for insertion, deletion, and search.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Node Structure<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;memory&gt;<\/span><\/span>\n\n<span class=\"hljs-keyword\">enum<\/span> Color { RED, BLACK };\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">struct<\/span> <span class=\"hljs-title\">Node<\/span> {<\/span>\n    <span class=\"hljs-keyword\">int<\/span> data;\n    <span class=\"hljs-keyword\">bool<\/span> color;\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; left, right, parent;\n\n    Node(<span class=\"hljs-keyword\">int<\/span> data) : data(data) {\n        parent = left = right = <span class=\"hljs-literal\">nullptr<\/span>;\n        color = RED;\n    }\n};<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Here, we use <code>enum Color<\/code> to define the color of the nodes. Each node has a data value, color, and pointers to its left child, right child, and parent. The <code>std::shared_ptr<\/code> is used for automatic memory management.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Red-Black Tree Class<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Now let&#8217;s define the Red-Black Tree class.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">RedBlackTree<\/span> {<\/span>\n<span class=\"hljs-keyword\">private<\/span>:\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; root;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">rotateLeft<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp;)<\/span><\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">rotateRight<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp;)<\/span><\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">fixInsert<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp;)<\/span><\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">fixDelete<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp;)<\/span><\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">transplant<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp;, <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp;)<\/span><\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; <span class=\"hljs-title\">minimum<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; node)<\/span><\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">deleteNode<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp;, <span class=\"hljs-keyword\">int<\/span>)<\/span><\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">deleteFix<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp;, <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp;)<\/span><\/span>;\n\n<span class=\"hljs-keyword\">public<\/span>:\n    RedBlackTree() { root = <span class=\"hljs-literal\">nullptr<\/span>; }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">insert<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">int<\/span>&amp; n)<\/span><\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">deleteNode<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">int<\/span>&amp; data)<\/span><\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; <span class=\"hljs-title\">search<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">int<\/span>&amp; n)<\/span><\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">inorder<\/span><span class=\"hljs-params\">()<\/span><\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">inorderHelper<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; node)<\/span><\/span>;\n};<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Rotations<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Rotations are a key part of maintaining the Red-Black Tree properties. Let&#8217;s implement the left and right rotations.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">RedBlackTree::rotateLeft<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp; x)<\/span> <\/span>{\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; y = x-&gt;right;\n    x-&gt;right = y-&gt;left;\n\n    <span class=\"hljs-keyword\">if<\/span> (y-&gt;left != <span class=\"hljs-literal\">nullptr<\/span>) {\n        y-&gt;left-&gt;parent = x;\n    }\n    y-&gt;parent = x-&gt;parent;\n\n    <span class=\"hljs-keyword\">if<\/span> (x-&gt;parent == <span class=\"hljs-literal\">nullptr<\/span>) {\n        root = y;\n    } <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (x == x-&gt;parent-&gt;left) {\n        x-&gt;parent-&gt;left = y;\n    } <span class=\"hljs-keyword\">else<\/span> {\n        x-&gt;parent-&gt;right = y;\n    }\n\n    y-&gt;left = x;\n    x-&gt;parent = y;\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">RedBlackTree::rotateRight<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp; x)<\/span> <\/span>{\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; y = x-&gt;left;\n    x-&gt;left = y-&gt;right;\n\n    <span class=\"hljs-keyword\">if<\/span> (y-&gt;right != <span class=\"hljs-literal\">nullptr<\/span>) {\n        y-&gt;right-&gt;parent = x;\n    }\n    y-&gt;parent = x-&gt;parent;\n\n    <span class=\"hljs-keyword\">if<\/span> (x-&gt;parent == <span class=\"hljs-literal\">nullptr<\/span>) {\n        root = y;\n    } <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (x == x-&gt;parent-&gt;right) {\n        x-&gt;parent-&gt;right = y;\n    } <span class=\"hljs-keyword\">else<\/span> {\n        x-&gt;parent-&gt;left = y;\n    }\n\n    y-&gt;right = x;\n    x-&gt;parent = y;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Insertion<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The insert method involves inserting a new node like a standard BST and then fixing the tree to maintain the Red-Black properties.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">RedBlackTree::insert<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">int<\/span>&amp; data)<\/span> <\/span>{\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; node = <span class=\"hljs-built_in\">std<\/span>::make_shared&lt;Node&gt;(data);\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; y = <span class=\"hljs-literal\">nullptr<\/span>;\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; x = root;\n\n    <span class=\"hljs-keyword\">while<\/span> (x != <span class=\"hljs-literal\">nullptr<\/span>) {\n        y = x;\n        <span class=\"hljs-keyword\">if<\/span> (node-&gt;data &lt; x-&gt;data) {\n            x = x-&gt;left;\n        } <span class=\"hljs-keyword\">else<\/span> {\n            x = x-&gt;right;\n        }\n    }\n\n    node-&gt;parent = y;\n    <span class=\"hljs-keyword\">if<\/span> (y == <span class=\"hljs-literal\">nullptr<\/span>) {\n        root = node;\n    } <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (node-&gt;data &lt; y-&gt;data) {\n        y-&gt;left = node;\n    } <span class=\"hljs-keyword\">else<\/span> {\n        y-&gt;right = node;\n    }\n\n    node-&gt;color = RED;\n    fixInsert(node);\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">RedBlackTree::fixInsert<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp; k)<\/span> <\/span>{\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; u;\n    <span class=\"hljs-keyword\">while<\/span> (k-&gt;parent &amp;&amp; k-&gt;parent-&gt;color == RED) {\n        <span class=\"hljs-keyword\">if<\/span> (k-&gt;parent == k-&gt;parent-&gt;parent-&gt;right) {\n            u = k-&gt;parent-&gt;parent-&gt;left;\n            <span class=\"hljs-keyword\">if<\/span> (u &amp;&amp; u-&gt;color == RED) {\n                u-&gt;color = BLACK;\n                k-&gt;parent-&gt;color = BLACK;\n                k-&gt;parent-&gt;parent-&gt;color = RED;\n                k = k-&gt;parent-&gt;parent;\n            } <span class=\"hljs-keyword\">else<\/span> {\n                <span class=\"hljs-keyword\">if<\/span> (k == k-&gt;parent-&gt;left) {\n                    k = k-&gt;parent;\n                    rotateRight(k);\n                }\n                k-&gt;parent-&gt;color = BLACK;\n                k-&gt;parent-&gt;parent-&gt;color = RED;\n                rotateLeft(k-&gt;parent-&gt;parent);\n            }\n        } <span class=\"hljs-keyword\">else<\/span> {\n            u = k-&gt;parent-&gt;parent-&gt;right;\n\n            <span class=\"hljs-keyword\">if<\/span> (u &amp;&amp; u-&gt;color == RED) {\n                u-&gt;color = BLACK;\n                k-&gt;parent-&gt;color = BLACK;\n                k-&gt;parent-&gt;parent-&gt;color = RED;\n                k = k-&gt;parent-&gt;parent;\n            } <span class=\"hljs-keyword\">else<\/span> {\n                <span class=\"hljs-keyword\">if<\/span> (k == k-&gt;parent-&gt;right) {\n                    k = k-&gt;parent;\n                    rotateLeft(k);\n                }\n                k-&gt;parent-&gt;color = BLACK;\n                k-&gt;parent-&gt;parent-&gt;color = RED;\n                rotateRight(k-&gt;parent-&gt;parent);\n            }\n        }\n        <span class=\"hljs-keyword\">if<\/span> (k == root) {\n            <span class=\"hljs-keyword\">break<\/span>;\n        }\n    }\n    root-&gt;color = BLACK;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Deletion<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Deletion involves removing the node like a standard BST and then fixing the tree to maintain the Red-Black properties.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">RedBlackTree::transplant<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp; u, <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp; v)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">if<\/span> (u-&gt;parent == <span class=\"hljs-literal\">nullptr<\/span>) {\n        root = v;\n    } <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (u == u-&gt;parent-&gt;left) {\n        u-&gt;parent-&gt;left = v;\n    } <span class=\"hljs-keyword\">else<\/span> {\n        u-&gt;parent-&gt;right = v;\n    }\n    <span class=\"hljs-keyword\">if<\/span> (v != <span class=\"hljs-literal\">nullptr<\/span>) {\n        v-&gt;parent = u-&gt;parent;\n    }\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; <span class=\"hljs-title\">RedBlackTree::minimum<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; node)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">while<\/span> (node-&gt;left != <span class=\"hljs-literal\">nullptr<\/span>) {\n        node = node-&gt;left;\n    }\n    <span class=\"hljs-keyword\">return<\/span> node;\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">RedBlackTree::deleteNode<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">int<\/span>&amp; data)<\/span> <\/span>{\n    deleteNode(root, data);\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">RedBlackTree::deleteNode<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp; node, <span class=\"hljs-keyword\">int<\/span> key)<\/span> <\/span>{\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; z = <span class=\"hljs-literal\">nullptr<\/span>;\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; x, y;\n    <span class=\"hljs-keyword\">while<\/span> (node != <span class=\"hljs-literal\">nullptr<\/span>) {\n        <span class=\"hljs-keyword\">if<\/span> (node-&gt;data == key) {\n            z = node;\n        }\n\n        <span class=\"hljs-keyword\">if<\/span> (node-&gt;data &lt;= key) {\n            node = node-&gt;right;\n        } <span class=\"hljs-keyword\">else<\/span> {\n            node = node-&gt;left;\n        }\n    }\n\n    <span class=\"hljs-keyword\">if<\/span> (z == <span class=\"hljs-literal\">nullptr<\/span>) {\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Key not found in the tree\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n        <span class=\"hljs-keyword\">return<\/span>;\n    }\n\n    y = z;\n    <span class=\"hljs-keyword\">bool<\/span> yOriginalColor = y-&gt;color;\n    <span class=\"hljs-keyword\">if<\/span> (z\n\n-&gt;left == <span class=\"hljs-literal\">nullptr<\/span>) {\n        x = z-&gt;right;\n        transplant(z, z-&gt;right);\n    } <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (z-&gt;right == <span class=\"hljs-literal\">nullptr<\/span>) {\n        x = z-&gt;left;\n        transplant(z, z-&gt;left);\n    } <span class=\"hljs-keyword\">else<\/span> {\n        y = minimum(z-&gt;right);\n        yOriginalColor = y-&gt;color;\n        x = y-&gt;right;\n        <span class=\"hljs-keyword\">if<\/span> (y-&gt;parent == z) {\n            <span class=\"hljs-keyword\">if<\/span> (x != <span class=\"hljs-literal\">nullptr<\/span>) {\n                x-&gt;parent = y;\n            }\n        } <span class=\"hljs-keyword\">else<\/span> {\n            transplant(y, y-&gt;right);\n            y-&gt;right = z-&gt;right;\n            <span class=\"hljs-keyword\">if<\/span> (y-&gt;right != <span class=\"hljs-literal\">nullptr<\/span>) {\n                y-&gt;right-&gt;parent = y;\n            }\n        }\n        transplant(z, y);\n        y-&gt;left = z-&gt;left;\n        <span class=\"hljs-keyword\">if<\/span> (y-&gt;left != <span class=\"hljs-literal\">nullptr<\/span>) {\n            y-&gt;left-&gt;parent = y;\n        }\n        y-&gt;color = z-&gt;color;\n    }\n    <span class=\"hljs-keyword\">if<\/span> (yOriginalColor == BLACK) {\n        deleteFix(x);\n    }\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">RedBlackTree::deleteFix<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp; x)<\/span> <\/span>{\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; s;\n    <span class=\"hljs-keyword\">while<\/span> (x != root &amp;&amp; x-&gt;color == BLACK) {\n        <span class=\"hljs-keyword\">if<\/span> (x == x-&gt;parent-&gt;left) {\n            s = x-&gt;parent-&gt;right;\n            <span class=\"hljs-keyword\">if<\/span> (s-&gt;color == RED) {\n                s-&gt;color = BLACK;\n                x-&gt;parent-&gt;color = RED;\n                rotateLeft(x-&gt;parent);\n                s = x-&gt;parent-&gt;right;\n            }\n\n            <span class=\"hljs-keyword\">if<\/span> ((s-&gt;left == <span class=\"hljs-literal\">nullptr<\/span> || s-&gt;left-&gt;color == BLACK) &amp;&amp; (s-&gt;right == <span class=\"hljs-literal\">nullptr<\/span> || s-&gt;right-&gt;color == BLACK)) {\n                s-&gt;color = RED;\n                x = x-&gt;parent;\n            } <span class=\"hljs-keyword\">else<\/span> {\n                <span class=\"hljs-keyword\">if<\/span> (s-&gt;right == <span class=\"hljs-literal\">nullptr<\/span> || s-&gt;right-&gt;color == BLACK) {\n                    <span class=\"hljs-keyword\">if<\/span> (s-&gt;left != <span class=\"hljs-literal\">nullptr<\/span>) {\n                        s-&gt;left-&gt;color = BLACK;\n                    }\n                    s-&gt;color = RED;\n                    rotateRight(s);\n                    s = x-&gt;parent-&gt;right;\n                }\n\n                s-&gt;color = x-&gt;parent-&gt;color;\n                x-&gt;parent-&gt;color = BLACK;\n                <span class=\"hljs-keyword\">if<\/span> (s-&gt;right != <span class=\"hljs-literal\">nullptr<\/span>) {\n                    s-&gt;right-&gt;color = BLACK;\n                }\n                rotateLeft(x-&gt;parent);\n                x = root;\n            }\n        } <span class=\"hljs-keyword\">else<\/span> {\n            s = x-&gt;parent-&gt;left;\n            <span class=\"hljs-keyword\">if<\/span> (s-&gt;color == RED) {\n                s-&gt;color = BLACK;\n                x-&gt;parent-&gt;color = RED;\n                rotateRight(x-&gt;parent);\n                s = x-&gt;parent-&gt;left;\n            }\n\n            <span class=\"hljs-keyword\">if<\/span> ((s-&gt;left == <span class=\"hljs-literal\">nullptr<\/span> || s-&gt;left-&gt;color == BLACK) &amp;&amp; (s-&gt;right == <span class=\"hljs-literal\">nullptr<\/span> || s-&gt;right-&gt;color == BLACK)) {\n                s-&gt;color = RED;\n                x = x-&gt;parent;\n            } <span class=\"hljs-keyword\">else<\/span> {\n                <span class=\"hljs-keyword\">if<\/span> (s-&gt;left == <span class=\"hljs-literal\">nullptr<\/span> || s-&gt;left-&gt;color == BLACK) {\n                    <span class=\"hljs-keyword\">if<\/span> (s-&gt;right != <span class=\"hljs-literal\">nullptr<\/span>) {\n                        s-&gt;right-&gt;color = BLACK;\n                    }\n                    s-&gt;color = RED;\n                    rotateLeft(s);\n                    s = x-&gt;parent-&gt;left;\n                }\n\n                s-&gt;color = x-&gt;parent-&gt;color;\n                x-&gt;parent-&gt;color = BLACK;\n                <span class=\"hljs-keyword\">if<\/span> (s-&gt;left != <span class=\"hljs-literal\">nullptr<\/span>) {\n                    s-&gt;left-&gt;color = BLACK;\n                }\n                rotateRight(x-&gt;parent);\n                x = root;\n            }\n        }\n    }\n    x-&gt;color = BLACK;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Search<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The search operation is straightforward in a Red-Black Tree.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-function\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; <span class=\"hljs-title\">RedBlackTree::search<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">int<\/span>&amp; n)<\/span> <\/span>{\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; temp = root;\n    <span class=\"hljs-keyword\">while<\/span> (temp != <span class=\"hljs-literal\">nullptr<\/span>) {\n        <span class=\"hljs-keyword\">if<\/span> (n &lt; temp-&gt;data) {\n            temp = temp-&gt;left;\n        } <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (n &gt; temp-&gt;data) {\n            temp = temp-&gt;right;\n        } <span class=\"hljs-keyword\">else<\/span> {\n            <span class=\"hljs-keyword\">return<\/span> temp;\n        }\n    }\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">nullptr<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Inorder Traversal<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Inorder traversal is useful for verifying the structure of the tree.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">RedBlackTree::inorder<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    inorderHelper(root);\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">RedBlackTree::inorderHelper<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; node)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">if<\/span> (node == <span class=\"hljs-literal\">nullptr<\/span>) {\n        <span class=\"hljs-keyword\">return<\/span>;\n    }\n    inorderHelper(node-&gt;left);\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; node-&gt;data &lt;&lt; <span class=\"hljs-string\">\" \"<\/span>;\n    inorderHelper(node-&gt;right);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Complete Example<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Here is a complete example of a Red-Black Tree in C++ that includes insertion, deletion, and search operations.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"C++\" data-shcb-language-slug=\"cpp\"><span><code class=\"hljs language-cpp\"><span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;iostream&gt;<\/span><\/span>\n<span class=\"hljs-meta\">#<span class=\"hljs-meta-keyword\">include<\/span> <span class=\"hljs-meta-string\">&lt;memory&gt;<\/span><\/span>\n\n<span class=\"hljs-keyword\">enum<\/span> Color { RED, BLACK };\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">struct<\/span> <span class=\"hljs-title\">Node<\/span> {<\/span>\n    <span class=\"hljs-keyword\">int<\/span> data;\n    <span class=\"hljs-keyword\">bool<\/span> color;\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; left, right, parent;\n\n    Node(<span class=\"hljs-keyword\">int<\/span> data) : data(data) {\n        parent = left = right = <span class=\"hljs-literal\">nullptr<\/span>;\n        color = RED;\n    }\n};\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">RedBlackTree<\/span> {<\/span>\n<span class=\"hljs-keyword\">private<\/span>:\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; root;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">rotateLeft<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp;)<\/span><\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">rotateRight<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp;)<\/span><\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">fixInsert<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp;)<\/span><\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">fixDelete<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp;)<\/span><\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">transplant<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp;, <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp;)<\/span><\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; <span class=\"hljs-title\">minimum<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; node)<\/span><\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">deleteNode<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp;, <span class=\"hljs-keyword\">int<\/span>)<\/span><\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">deleteFix<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp;, <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp;)<\/span><\/span>;\n\n<span class=\"hljs-keyword\">public<\/span>:\n    RedBlackTree() { root = <span class=\"hljs-literal\">nullptr<\/span>; }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">insert<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">int<\/span>&amp; n)<\/span><\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">deleteNode<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">int<\/span>&amp; data)<\/span><\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; <span class=\"hljs-title\">search<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">int<\/span>&amp; n)<\/span><\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">inorder<\/span><span class=\"hljs-params\">()<\/span><\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">inorderHelper<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; node)<\/span><\/span>;\n};\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">RedBlackTree::rotateLeft<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp; x)<\/span> <\/span>{\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; y = x-&gt;right;\n    x-&gt;right = y-&gt;left;\n\n    <span class=\"hljs-keyword\">if<\/span> (y-&gt;left != <span class=\"hljs-literal\">nullptr<\/span>) {\n        y-&gt;left-&gt;parent = x;\n    }\n    y-&gt;parent = x-&gt;parent;\n\n    <span class=\"hljs-keyword\">if<\/span> (x-&gt;parent == <span class=\"hljs-literal\">nullptr<\/span>) {\n        root = y;\n    } <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (x == x-&gt;parent-&gt;left) {\n        x-&gt;parent-&gt;left = y;\n    } <span class=\"hljs-keyword\">else<\/span> {\n        x-&gt;parent-&gt;right = y;\n    }\n\n    y-&gt;left = x;\n    x-&gt;parent = y;\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">RedBlackTree::rotateRight<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp; x)<\/span> <\/span>{\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; y = x-&gt;left;\n    x-&gt;left = y-&gt;right;\n\n    <span class=\"hljs-keyword\">if<\/span> (y-&gt;right != <span class=\"hljs-literal\">nullptr<\/span>) {\n        y-&gt;right-&gt;parent = x;\n    }\n    y-&gt;parent = x-&gt;parent;\n\n    <span class=\"hljs-keyword\">if<\/span> (x-&gt;parent == <span class=\"hljs-literal\">nullptr<\/span>) {\n        root = y;\n    } <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (x == x-&gt;parent-&gt;right) {\n        x-&gt;parent-&gt;right = y;\n    } <span class=\"hljs-keyword\">else<\/span> {\n        x-&gt;parent-&gt;left = y;\n    }\n\n    y-&gt;right = x;\n    x-&gt;parent = y;\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">RedBlackTree::insert<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">int<\/span>&amp; data)<\/span> <\/span>{\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; node = <span class=\"hljs-built_in\">std<\/span>::make_shared&lt;Node&gt;(data);\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; y = <span class=\"hljs-literal\">nullptr<\/span>;\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; x = root;\n\n    <span class=\"hljs-keyword\">while<\/span> (x != <span class=\"hljs-literal\">nullptr<\/span>) {\n        y = x;\n        <span class=\"hljs-keyword\">if<\/span> (node-&gt;data &lt; x-&gt;data) {\n            x = x-&gt;left;\n        } <span class=\"hljs-keyword\">else<\/span> {\n            x = x-&gt;right;\n        }\n    }\n\n    node-&gt;parent = y;\n    <span class=\"hljs-keyword\">if<\/span> (y == <span class=\"hljs-literal\">nullptr<\/span>) {\n        root = node;\n    } <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (node-&gt;data &lt; y-&gt;data) {\n        y-&gt;left = node;\n    } <span class=\"hljs-keyword\">else<\/span> {\n        y-&gt;right = node;\n    }\n\n    node-&gt;color = RED;\n    fixInsert(node);\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">RedBlackTree::fixInsert<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp; k)<\/span> <\/span>{\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; u;\n    <span class=\"hljs-keyword\">while<\/span> (k-&gt;parent &amp;&amp; k-&gt;parent-&gt;color == RED) {\n        <span class=\"hljs-keyword\">if<\/span> (k-&gt;parent == k-&gt;parent-&gt;parent-&gt;right) {\n            u = k-&gt;parent-&gt;parent-&gt;left;\n            <span class=\"hljs-keyword\">if<\/span> (u &amp;&amp; u-&gt;color == RED) {\n                u-&gt;color = BLACK;\n                k-&gt;parent-&gt;color = BLACK;\n                k-&gt;parent-&gt;parent-&gt;color = RED;\n                k = k-&gt;parent-&gt;parent;\n            } <span class=\"hljs-keyword\">else<\/span> {\n                <span class=\"hljs-keyword\">if<\/span> (k == k-&gt;parent-&gt;left) {\n                    k = k-&gt;parent;\n                    rotateRight(k);\n                }\n                k-&gt;parent-&gt;color = BLACK;\n                k-&gt;parent-&gt;parent-&gt;color = RED;\n                rotateLeft(k-&gt;parent-&gt;parent);\n            }\n        } <span class=\"hljs-keyword\">else<\/span> {\n            u = k-&gt;parent-&gt;parent-&gt;right;\n\n            <span class=\"hljs-keyword\">if<\/span> (u &amp;&amp; u-&gt;color == RED) {\n                u-&gt;color = BLACK;\n                k-&gt;parent-&gt;color = BLACK;\n                k-&gt;parent-&gt;parent-&gt;color = RED;\n                k = k-&gt;parent-&gt;parent;\n            } <span class=\"hljs-keyword\">else<\/span> {\n                <span class=\"hljs-keyword\">if<\/span> (k == k-&gt;parent-&gt;right) {\n                    k = k-&gt;parent;\n                    rotateLeft(k);\n                }\n                k-&gt;parent-&gt;color = BLACK;\n                k-&gt;parent-&gt;parent-&gt;color = RED;\n                rotateRight(k-&gt;parent-&gt;parent);\n            }\n        }\n        <span class=\"hljs-keyword\">if<\/span> (k == root) {\n            <span class=\"hljs-keyword\">break<\/span>;\n        }\n    }\n    root-&gt;color = BLACK;\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">RedBlackTree::transplant<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp; u, <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp; v)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">if<\/span> (u-&gt;parent == <span class=\"hljs-literal\">nullptr<\/span>) {\n        root = v;\n    } <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (u == u-&gt;parent-&gt;left) {\n        u-&gt;parent-&gt;left = v;\n    } <span class=\"hljs-keyword\">else<\/span> {\n        u-&gt;parent-&gt;right = v\n\n;\n    }\n    <span class=\"hljs-keyword\">if<\/span> (v != <span class=\"hljs-literal\">nullptr<\/span>) {\n        v-&gt;parent = u-&gt;parent;\n    }\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; <span class=\"hljs-title\">RedBlackTree::minimum<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; node)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">while<\/span> (node-&gt;left != <span class=\"hljs-literal\">nullptr<\/span>) {\n        node = node-&gt;left;\n    }\n    <span class=\"hljs-keyword\">return<\/span> node;\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">RedBlackTree::deleteNode<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">int<\/span>&amp; data)<\/span> <\/span>{\n    deleteNode(root, data);\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">RedBlackTree::deleteNode<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp; node, <span class=\"hljs-keyword\">int<\/span> key)<\/span> <\/span>{\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; z = <span class=\"hljs-literal\">nullptr<\/span>;\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; x, y;\n    <span class=\"hljs-keyword\">while<\/span> (node != <span class=\"hljs-literal\">nullptr<\/span>) {\n        <span class=\"hljs-keyword\">if<\/span> (node-&gt;data == key) {\n            z = node;\n        }\n\n        <span class=\"hljs-keyword\">if<\/span> (node-&gt;data &lt;= key) {\n            node = node-&gt;right;\n        } <span class=\"hljs-keyword\">else<\/span> {\n            node = node-&gt;left;\n        }\n    }\n\n    <span class=\"hljs-keyword\">if<\/span> (z == <span class=\"hljs-literal\">nullptr<\/span>) {\n        <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Key not found in the tree\"<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n        <span class=\"hljs-keyword\">return<\/span>;\n    }\n\n    y = z;\n    <span class=\"hljs-keyword\">bool<\/span> yOriginalColor = y-&gt;color;\n    <span class=\"hljs-keyword\">if<\/span> (z-&gt;left == <span class=\"hljs-literal\">nullptr<\/span>) {\n        x = z-&gt;right;\n        transplant(z, z-&gt;right);\n    } <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (z-&gt;right == <span class=\"hljs-literal\">nullptr<\/span>) {\n        x = z-&gt;left;\n        transplant(z, z-&gt;left);\n    } <span class=\"hljs-keyword\">else<\/span> {\n        y = minimum(z-&gt;right);\n        yOriginalColor = y-&gt;color;\n        x = y-&gt;right;\n        <span class=\"hljs-keyword\">if<\/span> (y-&gt;parent == z) {\n            <span class=\"hljs-keyword\">if<\/span> (x != <span class=\"hljs-literal\">nullptr<\/span>) {\n                x-&gt;parent = y;\n            }\n        } <span class=\"hljs-keyword\">else<\/span> {\n            transplant(y, y-&gt;right);\n            y-&gt;right = z-&gt;right;\n            <span class=\"hljs-keyword\">if<\/span> (y-&gt;right != <span class=\"hljs-literal\">nullptr<\/span>) {\n                y-&gt;right-&gt;parent = y;\n            }\n        }\n        transplant(z, y);\n        y-&gt;left = z-&gt;left;\n        <span class=\"hljs-keyword\">if<\/span> (y-&gt;left != <span class=\"hljs-literal\">nullptr<\/span>) {\n            y-&gt;left-&gt;parent = y;\n        }\n        y-&gt;color = z-&gt;color;\n    }\n    <span class=\"hljs-keyword\">if<\/span> (yOriginalColor == BLACK) {\n        deleteFix(x);\n    }\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">RedBlackTree::deleteFix<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt;&amp; x)<\/span> <\/span>{\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; s;\n    <span class=\"hljs-keyword\">while<\/span> (x != root &amp;&amp; x-&gt;color == BLACK) {\n        <span class=\"hljs-keyword\">if<\/span> (x == x-&gt;parent-&gt;left) {\n            s = x-&gt;parent-&gt;right;\n            <span class=\"hljs-keyword\">if<\/span> (s-&gt;color == RED) {\n                s-&gt;color = BLACK;\n                x-&gt;parent-&gt;color = RED;\n                rotateLeft(x-&gt;parent);\n                s = x-&gt;parent-&gt;right;\n            }\n\n            <span class=\"hljs-keyword\">if<\/span> ((s-&gt;left == <span class=\"hljs-literal\">nullptr<\/span> || s-&gt;left-&gt;color == BLACK) &amp;&amp; (s-&gt;right == <span class=\"hljs-literal\">nullptr<\/span> || s-&gt;right-&gt;color == BLACK)) {\n                s-&gt;color = RED;\n                x = x-&gt;parent;\n            } <span class=\"hljs-keyword\">else<\/span> {\n                <span class=\"hljs-keyword\">if<\/span> (s-&gt;right == <span class=\"hljs-literal\">nullptr<\/span> || s-&gt;right-&gt;color == BLACK) {\n                    <span class=\"hljs-keyword\">if<\/span> (s-&gt;left != <span class=\"hljs-literal\">nullptr<\/span>) {\n                        s-&gt;left-&gt;color = BLACK;\n                    }\n                    s-&gt;color = RED;\n                    rotateRight(s);\n                    s = x-&gt;parent-&gt;right;\n                }\n\n                s-&gt;color = x-&gt;parent-&gt;color;\n                x-&gt;parent-&gt;color = BLACK;\n                <span class=\"hljs-keyword\">if<\/span> (s-&gt;right != <span class=\"hljs-literal\">nullptr<\/span>) {\n                    s-&gt;right-&gt;color = BLACK;\n                }\n                rotateLeft(x-&gt;parent);\n                x = root;\n            }\n        } <span class=\"hljs-keyword\">else<\/span> {\n            s = x-&gt;parent-&gt;left;\n            <span class=\"hljs-keyword\">if<\/span> (s-&gt;color == RED) {\n                s-&gt;color = BLACK;\n                x-&gt;parent-&gt;color = RED;\n                rotateRight(x-&gt;parent);\n                s = x-&gt;parent-&gt;left;\n            }\n\n            <span class=\"hljs-keyword\">if<\/span> ((s-&gt;left == <span class=\"hljs-literal\">nullptr<\/span> || s-&gt;left-&gt;color == BLACK) &amp;&amp; (s-&gt;right == <span class=\"hljs-literal\">nullptr<\/span> || s-&gt;right-&gt;color == BLACK)) {\n                s-&gt;color = RED;\n                x = x-&gt;parent;\n            } <span class=\"hljs-keyword\">else<\/span> {\n                <span class=\"hljs-keyword\">if<\/span> (s-&gt;left == <span class=\"hljs-literal\">nullptr<\/span> || s-&gt;left-&gt;color == BLACK) {\n                    <span class=\"hljs-keyword\">if<\/span> (s-&gt;right != <span class=\"hljs-literal\">nullptr<\/span>) {\n                        s-&gt;right-&gt;color = BLACK;\n                    }\n                    s-&gt;color = RED;\n                    rotateLeft(s);\n                    s = x-&gt;parent-&gt;left;\n                }\n\n                s-&gt;color = x-&gt;parent-&gt;color;\n                x-&gt;parent-&gt;color = BLACK;\n                <span class=\"hljs-keyword\">if<\/span> (s-&gt;left != <span class=\"hljs-literal\">nullptr<\/span>) {\n                    s-&gt;left-&gt;color = BLACK;\n                }\n                rotateRight(x-&gt;parent);\n                x = root;\n            }\n        }\n    }\n    x-&gt;color = BLACK;\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; <span class=\"hljs-title\">RedBlackTree::search<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">const<\/span> <span class=\"hljs-keyword\">int<\/span>&amp; n)<\/span> <\/span>{\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; temp = root;\n    <span class=\"hljs-keyword\">while<\/span> (temp != <span class=\"hljs-literal\">nullptr<\/span>) {\n        <span class=\"hljs-keyword\">if<\/span> (n &lt; temp-&gt;data) {\n            temp = temp-&gt;left;\n        } <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (n &gt; temp-&gt;data) {\n            temp = temp-&gt;right;\n        } <span class=\"hljs-keyword\">else<\/span> {\n            <span class=\"hljs-keyword\">return<\/span> temp;\n        }\n    }\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">nullptr<\/span>;\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">RedBlackTree::inorder<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    inorderHelper(root);\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">RedBlackTree::inorderHelper<\/span><span class=\"hljs-params\">(<span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">shared_ptr<\/span>&lt;Node&gt; node)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">if<\/span> (node == <span class=\"hljs-literal\">nullptr<\/span>) {\n        <span class=\"hljs-keyword\">return<\/span>;\n    }\n    inorderHelper(node-&gt;left);\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; node-&gt;data &lt;&lt; <span class=\"hljs-string\">\" \"<\/span>;\n    inorderHelper(node-&gt;right);\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    RedBlackTree tree;\n    tree.insert(<span class=\"hljs-number\">10<\/span>);\n    tree.insert(<span class=\"hljs-number\">20<\/span>);\n    tree.insert(<span class=\"hljs-number\">30<\/span>);\n    tree.insert(<span class=\"hljs-number\">15<\/span>);\n    tree.insert(<span class=\"hljs-number\">25<\/span>);\n\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Inorder Traversal of Created Tree\\n\"<\/span>;\n    tree.inorder();\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n\n    tree.deleteNode(<span class=\"hljs-number\">20<\/span>);\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-string\">\"Inorder Traversal after Deletion of 20\\n\"<\/span>;\n    tree.inorder();\n    <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">cout<\/span> &lt;&lt; <span class=\"hljs-built_in\">std<\/span>::<span class=\"hljs-built_in\">endl<\/span>;\n\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-number\">0<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C++<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cpp<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In this tutorial, we have covered the fundamental concepts of Red-Black Trees and provided a comprehensive implementation in C++. By understanding the properties and operations of Red-Black Trees, you can effectively utilize this data structure to ensure efficient data management and retrieval in your applications.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Implementing a Red-Black Tree in C++ requires a good understanding of data structures, algorithms, and the specific properties that make Red-Black Trees efficient for various operations. In this tutorial, we will cover everything from the fundamental concepts to the complete implementation of a Red-Black Tree in C++. Introduction to Red-Black Trees A Red-Black Tree is [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[9,4],"tags":[],"class_list":["post-2128","post","type-post","status-publish","format-standard","category-cplusplus","category-programming-languages","entry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How to Implement a Red-Black Tree in C++<\/title>\n<meta name=\"description\" content=\"A Red-Black Tree is a type of self-balancing binary search tree. Each node in the tree contains an extra bit for storing the color of the node\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.w3computing.com\/articles\/how-to-implement-a-red-black-tree-in-cpp\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Implement a Red-Black Tree in C++\" \/>\n<meta property=\"og:description\" content=\"A Red-Black Tree is a type of self-balancing binary search tree. Each node in the tree contains an extra bit for storing the color of the node\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.w3computing.com\/articles\/how-to-implement-a-red-black-tree-in-cpp\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-07-20T20:43:31+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-07-20T20:43:36+00:00\" \/>\n<meta name=\"author\" content=\"w3compadmin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"w3compadmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"TechArticle\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-implement-a-red-black-tree-in-cpp\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-implement-a-red-black-tree-in-cpp\\\/\"},\"author\":{\"name\":\"w3compadmin\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\"},\"headline\":\"How to Implement a Red-Black Tree in C++\",\"datePublished\":\"2024-07-20T20:43:31+00:00\",\"dateModified\":\"2024-07-20T20:43:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-implement-a-red-black-tree-in-cpp\\\/\"},\"wordCount\":610,\"articleSection\":[\"C++\",\"Programming Languages\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-implement-a-red-black-tree-in-cpp\\\/\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-implement-a-red-black-tree-in-cpp\\\/\",\"name\":\"How to Implement a Red-Black Tree in C++\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#website\"},\"datePublished\":\"2024-07-20T20:43:31+00:00\",\"dateModified\":\"2024-07-20T20:43:36+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\"},\"description\":\"A Red-Black Tree is a type of self-balancing binary search tree. Each node in the tree contains an extra bit for storing the color of the node\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-implement-a-red-black-tree-in-cpp\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-implement-a-red-black-tree-in-cpp\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-implement-a-red-black-tree-in-cpp\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Articles Home\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Programming Languages\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/programming-languages\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"C++\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/programming-languages\\\/cplusplus\\\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"How to Implement a Red-Black Tree in C++\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#website\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/\",\"name\":\"Developer Articles Hub\",\"description\":\"\",\"alternateName\":\"Developer Articles\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\",\"name\":\"w3compadmin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"contentUrl\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"caption\":\"w3compadmin\"},\"sameAs\":[\"http:\\\/\\\/w3computing.com\\\/articles\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Implement a Red-Black Tree in C++","description":"A Red-Black Tree is a type of self-balancing binary search tree. Each node in the tree contains an extra bit for storing the color of the node","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.w3computing.com\/articles\/how-to-implement-a-red-black-tree-in-cpp\/","og_locale":"en_US","og_type":"article","og_title":"How to Implement a Red-Black Tree in C++","og_description":"A Red-Black Tree is a type of self-balancing binary search tree. Each node in the tree contains an extra bit for storing the color of the node","og_url":"https:\/\/www.w3computing.com\/articles\/how-to-implement-a-red-black-tree-in-cpp\/","article_published_time":"2024-07-20T20:43:31+00:00","article_modified_time":"2024-07-20T20:43:36+00:00","author":"w3compadmin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"w3compadmin","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"TechArticle","@id":"https:\/\/www.w3computing.com\/articles\/how-to-implement-a-red-black-tree-in-cpp\/#article","isPartOf":{"@id":"https:\/\/www.w3computing.com\/articles\/how-to-implement-a-red-black-tree-in-cpp\/"},"author":{"name":"w3compadmin","@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561"},"headline":"How to Implement a Red-Black Tree in C++","datePublished":"2024-07-20T20:43:31+00:00","dateModified":"2024-07-20T20:43:36+00:00","mainEntityOfPage":{"@id":"https:\/\/www.w3computing.com\/articles\/how-to-implement-a-red-black-tree-in-cpp\/"},"wordCount":610,"articleSection":["C++","Programming Languages"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.w3computing.com\/articles\/how-to-implement-a-red-black-tree-in-cpp\/","url":"https:\/\/www.w3computing.com\/articles\/how-to-implement-a-red-black-tree-in-cpp\/","name":"How to Implement a Red-Black Tree in C++","isPartOf":{"@id":"https:\/\/www.w3computing.com\/articles\/#website"},"datePublished":"2024-07-20T20:43:31+00:00","dateModified":"2024-07-20T20:43:36+00:00","author":{"@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561"},"description":"A Red-Black Tree is a type of self-balancing binary search tree. Each node in the tree contains an extra bit for storing the color of the node","breadcrumb":{"@id":"https:\/\/www.w3computing.com\/articles\/how-to-implement-a-red-black-tree-in-cpp\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.w3computing.com\/articles\/how-to-implement-a-red-black-tree-in-cpp\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.w3computing.com\/articles\/how-to-implement-a-red-black-tree-in-cpp\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Articles Home","item":"https:\/\/www.w3computing.com\/articles\/"},{"@type":"ListItem","position":2,"name":"Programming Languages","item":"https:\/\/www.w3computing.com\/articles\/programming-languages\/"},{"@type":"ListItem","position":3,"name":"C++","item":"https:\/\/www.w3computing.com\/articles\/programming-languages\/cplusplus\/"},{"@type":"ListItem","position":4,"name":"How to Implement a Red-Black Tree in C++"}]},{"@type":"WebSite","@id":"https:\/\/www.w3computing.com\/articles\/#website","url":"https:\/\/www.w3computing.com\/articles\/","name":"Developer Articles Hub","description":"","alternateName":"Developer Articles","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.w3computing.com\/articles\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561","name":"w3compadmin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","url":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","contentUrl":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","caption":"w3compadmin"},"sameAs":["http:\/\/w3computing.com\/articles"]}]}},"featured_image_src":null,"featured_image_src_square":null,"author_info":{"display_name":"w3compadmin","author_link":"https:\/\/www.w3computing.com\/articles\/author\/w3compadmin\/"},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/2128","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/comments?post=2128"}],"version-history":[{"count":2,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/2128\/revisions"}],"predecessor-version":[{"id":2130,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/2128\/revisions\/2130"}],"wp:attachment":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/media?parent=2128"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/categories?post=2128"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/tags?post=2128"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}