Golang实现AVL树

来源:互联网 发布:心算除法的快速计算法 编辑:程序博客网 时间:2024/06/07 18:51

参考文章

通过golang实现AVL树,“参考文章”里面十分详细,这里根据C#版提供了Golang版

package mainimport "fmt"type Node AVLNodetype AVLTree *AVLNodetype AVLNode struct {    key    int    height int    left   AVLTree    right  AVLTree}func height(p AVLTree) int {    if p == nil {        return -1    } else {        return p.height    }}func max(a, b int) int {    if a > b {        return a    } else {        return b    }}func rotateLeftLeft(node AVLTree) AVLTree {    top := node.left    node.left = top.right    top.right = node    node.height = max(height(node.left), height(node.right)) + 1    top.height = max(height(top.left), node.height) + 1    return top}func rotateRightRight(node AVLTree) AVLTree {    top := node.right    node.right = top.left    top.left = node    node.height = max(height(node.left), height(node.right)) + 1    top.height = max(node.height, height(top.right)) + 1    return top}func rotateLeftRight(node AVLTree) AVLTree {    node.left = rotateLeftLeft(node.left)    return rotateLeftLeft(node)}func rotateRightLeft(node AVLTree) AVLTree {    node.right = rotateRightRight(node)    return rotateLeftLeft(node)}func Insert(tree AVLTree, key int) AVLTree {    if tree == nil {        tree = new(AVLNode)        tree.key = key        tree.height = 0        tree.left = nil        tree.right = nil    } else if key < tree.key {        tree.left = Insert(tree.left, key)        if height(tree.left) - height(tree.right) == 2 {            if key < tree.left.key {                tree = rotateLeftLeft(tree)            } else {                tree = rotateLeftRight(tree)            }        }    } else if key > tree.key {        tree.right = Insert(tree.right, key)        if height(tree.right) - height(tree.left) == 2 {            if key > tree.right.key {                tree = rotateRightRight(tree)            } else {                tree = rotateRightLeft(tree)            }        }    }    tree.height = max(height(tree.left), height(tree.right)) + 1    return tree}func findMid(tree AVLTree) {    if tree != nil {        findMid(tree.left)        fmt.Println(tree.key)        findMid(tree.right)    }}func main() {    data := []int{3, 5, 1, 7, 9, 2, 6, 0, 8, 4, 10}    var tree AVLTree = nil    for _, value := range data {        tree = Insert(tree, value)    }    findMid(tree)    fmt.Println()}
0 0
原创粉丝点击