Hướng dẫn red-black tree python library - thư viện trăn cây đỏ đen

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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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

  1. Chỉ định ‘A, là đứa con phải của‘ n, nếu ‘B, là đứa con phù hợp của‘ n ,.
  2. 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 

Bài Viết Liên Quan

Chủ Đề