Golang 搜索红黑树中的节点的程序

Golang 搜索红黑树中的节点的程序

在红黑树中搜索节点是为了找到具有特定键或值的节点。在红黑树中进行搜索类似于在标准二叉树中进行搜索。在本文中,我们将编写Go语言程序来在红黑树中搜索节点。它是一种自平衡的二叉搜索树,具有根节点始终为黑色,其他节点按照属性为红色或黑色的特性。该树使用旋转来在插入和删除时保持平衡。

属性

  • 每个节点要么是红色或黑色

  • 根节点始终为黑色

  • 所有叶子节点都是黑色的

  • 如果一个节点是红色的,那么它的两个子节点都是黑色的

  • 从一个节点到其子孙叶节点的每条路径都包含相同数量的黑色节点

语法

func NewRedBlackTree() *RedBlackTree { return &RedBlackTree{} }

创建一棵红黑树。

func (t *RedBlackTree) Insert(data int) { // ... }

向树中插入包含数据的新节点。

func (t *RedBlackTree) leftRotate(node *Node) { // ... }

对树进行左旋操作。

func (t *RedBlackTree) Search(key int) *Node { // ... }

搜索具有特定键值的节点。

步骤

  • 导入所需的包

  • 创建一个常量,类型为”Colour”,值为”Red”和”Black”分别赋值为0和1。

  • 定义数据结构:创建一个名为”RedBlackTree”的结构体,有一个指向根节点的字段”root”。

  • 创建一个名为”NewRedBlackTree”的函数,创建并返回一个新的红黑树实例。

示例1

在下面的示例中,使用一个结构体定义了一个红黑树,包括一个根节点。下面的代码展示了红黑树的构造、插入和搜索操作,突出了数据结构的自平衡特性和快速搜索能力。

package main

import "fmt"

type Color int

const (
   Red   Color = 0
   Black Color = 1
)

type Node struct {
   data        int
   color       Color
   left, right *Node
   parent      *Node
}

type RedBlackTree struct {
   root *Node
}

func NewRedBlackTree() *RedBlackTree {
   return &RedBlackTree{}
}

func (t *RedBlackTree) Insert(data int) {
   newNode := &Node{data: data, color: Red}
   t.insertNode(newNode)

   t.fixInsertion(newNode)
}

func (t *RedBlackTree) insertNode(newNode *Node) {
   if t.root == nil {
      t.root = newNode
      return
   }

   current := t.root
   var parent *Node
   for current != nil {
      parent = current
      if newNode.data < current.data {
         current = current.left
      } else if newNode.data > current.data {
         current = current.right
      } else {

         return
      }
   }

   newNode.parent = parent
   if newNode.data < parent.data {
      parent.left = newNode
   } else {
      parent.right = newNode
   }
}

func (t *RedBlackTree) fixInsertion(node *Node) {
   for node.parent != nil && node.parent.color == Red {
      if node.parent == node.parent.parent.left {
         uncle := node.parent.parent.right

         if uncle != nil && uncle.color == Red {
            node.parent.color = Black
            uncle.color = Black
            node.parent.parent.color = Red
            node = node.parent.parent
         } else {
            if node == node.parent.right {
               node = node.parent
               t.leftRotate(node)
            }

            node.parent.color = Black
            node.parent.parent.color = Red
            t.rightRotate(node.parent.parent)
         }
      } else {
         uncle := node.parent.parent.left

         if uncle != nil && uncle.color == Red {
            node.parent.color = Black
            uncle.color = Black
            node.parent.parent.color = Red
            node = node.parent.parent
         } else {
            if node == node.parent.left {
               node = node.parent
               t.rightRotate(node)
            }

            node.parent.color = Black
            node.parent.parent.color = Red
            t.leftRotate(node.parent.parent)
         }
      }
   }

   t.root.color = Black
}

func (t *RedBlackTree) leftRotate(node *Node) {
   rightChild := node.right
   node.right = rightChild.left

   if rightChild.left != nil {
      rightChild.left.parent = node
   }

   rightChild.parent = node.parent

   if node.parent == nil {
      t.root = rightChild
   } else if node == node.parent.left {
      node.parent.left = rightChild
   } else {
      node.parent.right = rightChild
   }

   rightChild.left = node
   node.parent = rightChild
}

func (t *RedBlackTree) rightRotate(node *Node) {
   leftChild := node.left
   node.left = leftChild.right

   if leftChild.right != nil {
      leftChild.right.parent = node
   }

   leftChild.parent = node.parent

   if node.parent == nil {
      t.root = leftChild
   } else if node == node.parent.left {
      node.parent.left = leftChild
   } else {
      node.parent.right = leftChild
   }

   leftChild.right = node
   node.parent = leftChild
}

func (t *RedBlackTree) Search(key int) *Node {
   current := t.root
   for current != nil {
      if key == current.data {
         return current
      } else if key < current.data {
         current = current.left
      } else {
         current = current.right
      }
   }
   return nil
}

func main() {
   tree := NewRedBlackTree()

   tree.Insert(60)
   tree.Insert(40)
   tree.Insert(20)
   tree.Insert(40)
   tree.Insert(30)

   search_key := 40
   result := tree.Search(search_key)
   if result != nil {
      fmt.Printf("Node with value %d found\n", search_key)
   } else {
      fmt.Printf("Node with value %d not found\n", search_key)
   }
}

输出

Node with value 40 found.

结论

在本文中,我们讨论了如何在红黑树中搜索节点。为了搜索一个值,我们首先创建了一个红黑树,插入了一个带有数据的节点,然后搜索特定的值。红黑树被用来表示文件管理系统中的目录和文件,它可以用作调度器中的优先队列,还可以修改为实现区间树等等。这些都是红黑树可以在Go语言中使用的少数应用程序。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程