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 语言中对红黑树执行左旋转。我们探讨了如何使用指针和节点交换以及使用节点值来执行此操作。在自平衡树(如红黑树)上执行这些操作对于保持其平衡至关重要。
广告