Go语言程序:实现红黑树的左旋转


红黑树是一种自平衡二叉搜索树。旋转是自平衡树的基本操作之一。在向树中插入和删除节点时,执行旋转操作以保持树的特性。在这篇文章中,我们将编写一个程序来使用指针以及节点值在红黑树中执行左旋转。

红黑树的特性

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

  • 根节点总是黑色

  • 每个叶子节点都被认为是黑色

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

算法

  • 步骤 1 − 导入 main 和 fmt 包。

  • 步骤 2 − 检查输入节点和右子节点是否存在。如果不存在,则退出函数。

  • 步骤 3 − 将节点的右子节点赋值给 pivot 变量。

  • 步骤 4 − 现在将节点的右子节点更新为 pivot 的左子节点。

  • 步骤 5 − 如果 pivot 的左子节点已存在,则将 pivot 的左子节点的父节点更新为该节点。

  • 步骤 6 − 现在将 pivot 的父节点更新为节点的父节点。如果节点是根节点,则更新根节点引用。

示例 1:使用指针和节点交换

左旋转是红黑树的基本方法,用于在保持元素顺序的同时保持平衡。在这种方法中,我们将通过操作指针和交换节点引用来执行左旋转。

package main

import (
   "fmt"
)

type Node struct {
   key    int
   color  bool
   left   *Node
   right  *Node
   parent *Node
}

var root *Node

func leftRotate(node *Node) {
   if node == nil || node.right == nil {
      return
   }

   pivot := node.right
   node.right = pivot.left

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

   pivot.parent = node.parent

   if node.parent == nil {
      // If the node was the root, update the root reference
      root = pivot
   } else if node == node.parent.left {
      node.parent.left = pivot
   } else {
      node.parent.right = pivot
   }

   pivot.left = node
   node.parent = pivot
}

func main() {
   // Sample usage of leftRotate function
   root = &Node{
      key:   15,
      color: false,
      left:  nil,
      right: nil,
   }

   node1 := &Node{
      key:   25,
      color: true,
      left:  nil,
      right: nil,
   }

   node2 := &Node{
      key:   35,
      color: true,
      left:  nil,
      right: nil,
   }

   root.right = node1
   node1.parent = root
   node1.right = node2
   node2.parent = node1

   fmt.Println("Before left rotation:")
   fmt.Println("Rootkey:", root.key)
   fmt.Println("right child key of Root :", root.right.key)
   fmt.Println(" right child key of right child key of root:", root.right.right.key)

   leftRotate(root)

   fmt.Println("\nAfter left rotation:")
   fmt.Println("Rootkey:", root.key)
   fmt.Println("left child key of Root's :", root.left.key)
}

输出

Before left rotation: 
Rootkey: 15 
right child key of Root : 25
right child key of right child key of root: 35

After left rotation:
Rootkey: 25 
left child key of Root's : 15

示例 2:使用节点值

左旋转是红黑树的基本方法,用于在保持元素顺序的同时保持平衡。在这种方法中,我们将通过复制节点的值而不是直接操作指针来执行左旋转。

package main

import (
   "fmt"
)

type Node struct {
   key    int
   color  bool
   left   *Node
   right  *Node
   parent *Node
}

var root *Node

func leftRotate(node *Node) {
   if node == nil || node.right == nil {
      return
   }

   pivot := &Node{
      key:    node.right.key,
      color:  node.right.color,
      left:   node.left,
      right:  node.right.left,
      parent: node,
   }

   if pivot.left != nil {
      pivot.left.parent = pivot
   }

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

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

   pivot.parent = node.parent
   node.parent = pivot
}

func main() {
   root = &Node{
      key:   15,
      color: false,
      left:  nil,
      right: nil,
   }

   node1 := &Node{
      key:   25,
      color: true,
      left:  nil,
      right: nil,
   }

   node2 := &Node{
      key:   35,
      color: true,
      left:  nil,
      right: nil,
   }

   root.right = node1
   node1.parent = root
   node1.right = node2
   node2.parent = node1

   fmt.Println("Before left rotation:")
   fmt.Println("Root key:", root.key)
   fmt.Println("Right child key of Root:", root.right.key)
   fmt.Println("Right child key of right child key of Root:", root.right.right.key)

   leftRotate(root)

   fmt.Println("\nAfter left rotation:")
   fmt.Println("Root key:", root.key)
}

输出

Before left rotation: 
Rootkey: 15 
right child key of Root : 25
right child key of right child key of root: 35

After left rotation:
Rootkey: 25 
left child key of Root's : 15

结论

在这篇文章中,我们检查了如何在 Go 语言中对红黑树执行左旋转。我们探讨了如何使用指针和节点交换以及使用节点值来执行此操作。在自平衡树(如红黑树)上执行这些操作对于保持其平衡至关重要。

更新于:2023年7月6日

76 次查看

开启您的职业生涯

通过完成课程获得认证

开始学习
广告