Trong bài viết này, chúng tôi sẽ nghiên cứu một cây đen đỏ là gì và tại sao nó hữu ích. Chúng tôi sẽ hiểu các hoạt động khác nhau của cây màu đỏ đỏ cùng với thuật toán, ví dụ và mã Python của chúng. Sau đó, chúng tôi cũng sẽ trải qua các ưu điểm, nhược điểm và ứng dụng khác nhau của cây đỏ đen. & NBSP;
Cây đỏ đen là gì?
Một cây đen đỏ là biến thể của cây tìm kiếm nhị phân với tính chất tự cân bằng. Một cây đen đỏ còn được gọi là Binary B-cây đối xứng. Mỗi nút của cây màu đỏ đỏ chứa một thuộc tính bổ sung biểu thị màu của nút, cụ thể là màu đỏ hoặc đen. Tầm quan trọng của các màu này trong các nút của cây đảm bảo rằng cây được cân bằng trong khi chèn và xóa các hoạt động của nút. Do đó, cây đen đỏ tuân theo các thuộc tính dưới đây:binary search tree with the property of self-balancing. A red-black tree is also called symmetric binary B-Tree. Every node of the red-black tree contains an extra attribute denoting the color of the node, specifically, either red or black. The importance of these colors in the nodes of the tree ensures that the tree is balanced while insertion and deletion operations of the node. Therefore, the red-black tree follows the below properties:
- Tài sản cây: Cây đen đỏ nên là cây tìm kiếm nhị phân. Red-Black tree should be a binary search tree.
- Thuộc tính màu đỏ/đen: Mỗi nút của cây đều có màu đỏ hoặc đen. Every node of the tree is colored either red or black.
- Thuộc tính gốc: Thuộc tính màu của nút gốc luôn màu đen. The color attribute of the root node is always black.
- Tài sản của lá: Mỗi chiếc lá của cây là màu đen. Every leaf of the tree is black.
- Thuộc tính màu đỏ: Nút trẻ luôn có màu đen nếu nút cha có màu đỏ. Do đó, không nên có hai nút đỏ liên tiếp. The child node is always black if the parent node is red in color. Therefore, there should not be two consecutive red nodes.
- Thuộc tính độ sâu: Mọi đường dẫn từ nút gốc đến bất kỳ nút lá nào cũng phải có cùng số nút màu đen. Every path from the root node to any leaf node should have the same number of black-colored nodes.
Hãy nhớ rằng mọi nút của cây màu đỏ đỏ chỉ tiêu thụ 1 bit bộ nhớ lưu trữ để lưu trữ thông tin màu, do đó cây giống hệt với cây tìm kiếm nhị phân cổ điển.
Tại sao phải sử dụng cây màu đỏ đen? & NBSP;
Như bạn đã biết rằng cây tìm kiếm nhị phân duy trì thứ tự tự nhiên của dữ liệu được chèn, nhưng nó không hạn chế kích thước, chiều dài hoặc chiều cao của cây. Hãy xem xét hình ảnh dưới đây nơi các nút được chèn vào cây tìm kiếm nhị phân là 10,20,30,40,50. Ở đây, chiều cao của cây là 5 khi cây phát triển tuyến tính khi nút mới được chèn. Do đó, khi chiều cao của cây phát triển tuyến tính, hoạt động tìm kiếm trong cây trở thành trường hợp xấu nhất và mất thời gian O [n] trong đó n là tổng số nút được chèn.height of the tree. Consider the below image where the nodes inserted in the binary search tree are 10,20,30,40,50. Here, the height of the tree is 5 as the tree grows linearly when the new node is inserted. Hence, as the height of the tree grows linearly, the search operation in the tree becomes the worst-case scenario and takes O[n] time where n is the total number of nodes inserted.
Vấn đề này có thể được giải quyết bằng cách sử dụng một cây màu đen đỏ. Khi cây màu đen màu đỏ duy trì chiều cao của cây sau mỗi lần chèn và xóa, cây có thể tránh khỏi độ lệch. Do đó, độ phức tạp thời gian cho hoạt động tìm kiếm được giảm xuống O [log n] trong đó n là số lượng nút trong cây.O[log n] where n is the number of nodes in the tree.
Thay vì một cây đen đỏ, bạn cũng có thể sử dụng cây AVL để cân bằng chiều cao của cây. Nhưng cần lưu ý rằng cây màu đen đỏ tạo ra ít thay đổi cấu trúc hơn để cân bằng chiều cao của cây so với cây AVL. Do đó, cây đen đỏ có khả năng nhanh hơn trong quá trình chèn và xóa so với cây AVL.AVL tree to balance the height of the tree. But it is noted, that the red-black tree makes fewer structural changes to balance the height of the tree in comparison to AVL trees. Hence, the red-black tree is potentially faster during insertion and deletion operations in comparison to AVL trees.
Xoay trong cây đen màu đỏ
Xoay là quá trình điều chỉnh hoặc trao đổi các nút của các cây con bên trong cây theo cách mà chiều cao của cây được khôi phục. Nó giúp duy trì các thuộc tính cây màu đỏ đỏ đôi khi bị vi phạm trong khi chèn và xóa các hoạt động. Về cơ bản, có hai loại xoay trong cây đỏ đen:
1] Xoay bên trái
Các nút ở bên phải của cây được chuyển đổi ở nút bên trái được gọi là xoay bên trái. Nhìn vào thuật toán dưới đây để hiểu.
Thuật toán
- Hãy xem xét cây màu đỏ đỏ dưới đây
- Chỉ định ‘A, là một nút cha mẹ của cây con bên trái của‘ B, nếu ‘B, có một cây con bên trái.
- Gán ‘B, làm gốc của cây nếu nút cha của‘ A, là NULL
- Gán ‘bv là đứa con trái của‘ n, nếu ’a, là đứa con trái của‘ n,
- Gán ‘bv là đứa con đúng của‘ n, nếu ’một con là con đúng của’ n,
- Làm ‘b… làm nút cha mẹ của‘ a
2] Xoay bên phải
Các nút ở bên trái của cây được chuyển đổi ở nút bên phải được gọi là vòng quay bên trái. Nhìn vào thuật toán dưới đây để hiểu.
Thuật toán
- Hãy xem xét cây màu đỏ đỏ dưới đây
- Chỉ định ‘A, là một nút cha mẹ của cây con bên trái của‘ B, nếu ‘B, có một cây con bên trái.
- Gán ‘B, làm gốc của cây nếu nút cha của‘ A, là NULL
- Gán ‘bv là đứa con trái của‘ n, nếu ’a, là đứa con trái của‘ n,
- Gán ‘bv là đứa con đúng của‘ n, nếu ’một con là con đúng của’ n,
- Làm ‘b… làm nút cha mẹ của‘ a
2] Xoay bên phải
Các nút ở bên trái của cây được chuyển đổi ở nút bên phải được gọi là vòng quay bên trái. Nhìn vào thuật toán dưới đây để hiểu.
Hãy xem xét cây màu đỏ đỏ bên dưới
Chỉ định ‘B, làm nút mẹ của phần cây con bên phải của‘ A, nếu ‘A, có một cây con bên phải
Gán ’a" là gốc của cây nếu cha mẹ của ‘b, là null
- Chỉ định ‘A, là đứa con phải của‘ n, nếu ‘B, là đứa con phù hợp của‘ n ,.
- Gán ‘A" là đứa con trái của ‘n, nếu‘ B, là đứa con phù hợp của ‘n,
Tạo ra ’một" là nút cha mẹ của ‘B,
3] Xoay bên trái và bên trái phảiRed Node. This is because the insertion of a new node does not violate the depth property of the red-black tree. But what if the red node gets attached to the red node? Well, this problem is easier to fix using rotation rather than violating the depth property of the tree. Later, if the tree properties are violated then the red-black tree undergoes the following operations:
- Recolor
- Vòng xoay
Thuật toán để chèn nút
Let ‘x’ be the root node of the tree and ‘y’ be the leaf node If the tree is empty, add NewNode as the root node and black in color Else, repeat the below steps till we reach the leaf of the tree Compare NewNode with RootNode If NewNode is greater than RootNode, traverse to the right subtree Otherwise, traverse through the left subtree Assign parent of leaf to parent of NewNode If LeafNode is greater than NewNode, assign NewNode as RightChild Otherwise, assign NewNode as LeftChild Assign Null to LeftChild and RightChild of NewNode Assign NewNode as Red color Apply InsertionFix Algorithm if the property of the red-black tree is violated
Thuật toán chèn để duy trì thuộc tính cây đen đỏ
If parent ‘n’ of NewNode is Red then: If ‘n’ is the LeftChild of GrandParent ‘gp’ of ‘m’ then Case 1: If RightChild of ‘gp’ is Red color, set color of both children of ‘gp’ as Black color and ‘gp’ as Red Color Assign ‘gp’ to NewNode Case 2: If NewNode is RightChild of ‘n’ then, assign ‘n’ to NewNode Left-Rotate NewNode Case 3: Assign ‘n’ as Black and ‘gp’ as Red Right-Rotate ‘gp’ Otherwise, do the following If LeftChild of ‘gp’ of ‘z’ is Red color, then set both children of ‘gp’ as Black color and ‘gp’ as Red color Assign ‘gp’ to NewNode If NewNode is LeftChild of ‘n’ then, assign ‘n’ to NewNode and Right Rotate NewNode Set ‘n’ as Black color and ‘gp’ as Red color Left-Rotate ‘gp’ Set Root of the tree as Black color
Thí dụ
Chèn nút ‘4 bên trong một cây trống. Như đã thảo luận, phần tử được chèn đầu tiên luôn là nút gốc và màu đen
Bây giờ, chèn nút ‘20, bên trong cây. Như 20> 4, nó sẽ được chèn dưới dạng cây con phù hợp của nút gốc và màu đỏ
Bây giờ, chèn nút ‘31 bên trong cây. Như 31> 20, nó sẽ là con phù hợp của nút cha ‘20. Node xông 31 có màu đỏ và theo tính chất của cây màu đỏ đen, không có hai nút màu đỏ nào có thể được cùng nhau và do đó chúng tôi trải qua vòng quay RR để lấy lại sự cân bằng của cây.
Bây giờ, chèn nút ‘14 bên trong cây. Như 14> 4 nhưng 14
Do đó, cấu trúc cây cuối cùng sẽ được đưa ra dưới đây:
Hoạt động xóa
Khi bạn xóa một nút từ cây, có những khả năng bạn vi phạm thuộc tính cây đen đỏ. Do đó, sau khi tháo nút ra khỏi cây, hãy đảm bảo bạn cân bằng cây bằng cách làm theo các thuộc tính của cây.
Thuật toán để xóa một nút
Save the color of DeletingNode in OriginalColor If LeftChild of DeletingNode is Null Assign the RightChild of DeletingNode to be ‘a’ Transplant DeletingNode with ‘a’ Otherwise, if the RighChild of DeletingNode is Null Assign the LeftChild of DeletingNode into ‘a’ Transplant DeletingNode with ‘a’ Otherwise Assign the minimum of Right-Subtree of DeletingNode into ‘b’ Save the color of ‘b’ in OriginalColor Assign the RightChild of ‘b’ into ‘a’ If ‘b’ is a child of DeletingNode, then set the parent of ‘a’ as ‘b’ Otherwise, transplant ‘b’ with RightChild of ‘b’ Transplant DeletingNode with ‘b’ Set color of ‘b’ with OriginalColor Call DeletionFix if the OriginalColor is Black
Khi việc DeletingNode có màu đen, nó vi phạm thuộc tính cây đen đỏ. Kịch bản này có thể được sửa chữa bằng cách giả sử rằng nút ‘A, có thêm màu đen. Do đó, nút ’A, không phải là màu đỏ hay đen thay vào đó là màu đen hoặc đen và đỏ cùng một lúc. Do đó, tài sản cây đen đỏ bị vi phạm.
Do đó, có thể loại bỏ thêm màu đen nếu
- Nó đạt đến rootnodeRootNode
- Nếu ‘một điểm chỉ vào nút Đỏ. Trong trường hợp này, ’A, có màu, đen
- Xoay và giải quyết được yêu cầu được thực hiện
Thuật toán xóaFix để duy trì thuộc tính cây đen đỏ
Repeat the following until the ‘a’ is not the RootNode of the tree and ‘a’ is not the Black colored If ‘a’ is the LeftChild of its parent then, Assign ‘n’ to the sibling of ‘a’ If RightChild of the parent of ‘a’ is Red Case 1: Set RightChild of the parent of ‘a’ as Black color Set parent of ‘a’ as Red Color Left-Rotate the parent of ‘a’ Assign the RightChild of the parent of ‘a’ to ‘n’ If RightChild and the LeftChild of ‘n’ is Black in color Case 2: Set ‘n’ as Red color Assign parent of ‘a’ to ‘a’ Otherwise, if the RightChild of ‘n’ is Black in color Case 3: Set the LeftChild of ‘n’ as Black color Set ‘n’ as Red color Right-rotate ‘n’ Assign the RightChild of the parent of ‘a’ to ‘n’ If all of the above cases don’t occur, then do the following Case 4: Set color of ‘n’ as the color of the parent of ‘a’ Set parent of ‘a’ as Black color Set RightChild ‘n’ as Black color Left-rotate the parent of ‘a’ Set ‘a’ as RootNode of tree Repeat the same steps as above by interchanging the right to left and vice versa Set ‘a’ as Black color
Thí dụ
Chèn nút ‘4 bên trong một cây trống. Như đã thảo luận, phần tử được chèn đầu tiên luôn là nút gốc và màu đen
Bây giờ, chèn nút ‘20, bên trong cây. Như 20> 4, nó sẽ được chèn dưới dạng cây con phù hợp của nút gốc và màu đỏ
Bây giờ, chèn nút ‘31 bên trong cây. Như 31> 20, nó sẽ là con phù hợp của nút cha ‘20. Node xông 31 có màu đỏ và theo tính chất của cây màu đỏ đen, không có hai nút màu đỏ nào có thể được cùng nhau và do đó chúng tôi trải qua vòng quay RR để lấy lại sự cân bằng của cây.
Bây giờ, chèn nút ‘14 bên trong cây. Như 14> 4 nhưng 14
Do đó, cấu trúc cây cuối cùng sẽ được đưa ra dưới đây:
# Define Node class Node[]: def __init__[self,val]: self.val = val # Value of Node self.parent = None # Parent of Node self.left = None # Left Child of Node self.right = None # Right Child of Node self.color = 1 # Red Node as new node is always inserted as Red Node # Define R-B Tree class RBTree[]: def __init__[self]: self.NULL = Node [ 0 ] self.NULL.color = 0 self.NULL.left = None self.NULL.right = None self.root = self.NULL # Insert New Node def insertNode[self, key]: node = Node[key] node.parent = None node.val = key node.left = self.NULL node.right = self.NULL node.color = 1 # Set root colour as Red y = None x = self.root while x != self.NULL : # Find position for new node y = x if node.val