数据结构算法回顾-B-tree

代码

package B_tree

import (
    "fmt"
    "math/rand"
)

type btree_node struct {
    num    int
    key    []int
    child  []*btree_node
    parent *btree_node
}

type btree struct {
    order int
    max   int
    min   int
    sidx  int
    root  *btree_node
    first *btree_node
}

func new_btree(order int) *btree {
    newBtree := new(btree)
    newBtree.order = order
    newBtree.max = order - 1
    if order%2 == 0 {
        newBtree.min = (order - 1) / 2
    } else {
        newBtree.min = order / 2
    }
    newBtree.sidx = order / 2
    return newBtree
}

func new_node(tree *btree) *btree_node {
    node := new(btree_node)
    node.key = make([]int, tree.max+1)
    node.child = make([]*btree_node, tree.order+1)
    return node
}

func find_insert_index(node *btree_node, key int) (int, interface{}) {
    for i := 0; i < node.num; i++ {
        if node.key[i] == key {
            return i, "find key in node"
        } else if node.key[i] > key {
            return i, nil
        }
    }
    return node.num, nil
}

func find_child_index(node *btree_node, child *btree_node) int {
    for i := 0; i < node.num+1; i++ {
        if node.child[i] == child {
            return i
        }
    }
    return 0
}

func insert_key(node *btree_node, key int, index int) {
    if node.num != 0 {
        for i := node.num - 1; i >= index; i-- {
            node.key[i+1] = node.key[i]
        }
    }
    node.key[index] = key
    node.num++
}

func insert_child(node *btree_node, child *btree_node, index int) {
    for i := node.num - 1; i >= index; i-- {
        node.child[i+1] = node.child[i]
    }
    node.child[index] = child
}

func cut_node(node1 *btree_node, index int, node2 *btree_node) {
    j := 0
    i := index
    end := node1.num
    for i < end {
        node2.child[j] = node1.child[i]
        if node2.child[j] != nil {
            node2.child[j].parent = node2
        }
        node2.key[j] = node1.key[i]
        node1.child[i] = nil
        node1.key[i] = 0
        i++
        j++
        node1.num--
        node2.num++
    }
    node2.child[j] = node1.child[i]
    if node2.child[j] != nil {
        node2.child[j].parent = node2
    }
    node1.child[i] = nil
}

func find_node_index(node *btree_node, key int) (*btree_node, int) {
    for node != nil {
        index, is_find := find_insert_index(node, key)
        if is_find != nil {
            return node, index
        }
        node = node.child[index]
    }
    return node, 0
}

func delete_node_index(node *btree_node, index int) (*btree_node, int) {
    leftChild := node.child[index]
    rightChild := node.child[index+1]
    tmpNode := node
    tmpIndex := index
    if leftChild != nil {
        if leftChild.num >= rightChild.num {
            for tmpNode.child[tmpIndex] != nil {
                num := tmpNode.child[tmpIndex].num
                tmpNode = tmpNode.child[tmpIndex]
                tmpIndex = num
            }
            tmpIndex--
        } else {
            tmpIndex := index + 1
            for tmpNode.child[tmpIndex] != nil {
                tmpNode = tmpNode.child[tmpIndex]
                tmpIndex = 0
            }
        }
    }
    node.key[index] = tmpNode.key[tmpIndex]
    return tmpNode, tmpIndex
}

func find_brother(tree *btree, node *btree_node) (*btree_node, int, int, int) {
    num := node.parent.num
    index := 0
    for i := 0; i <= num; i++ {
        if node.parent.child[i] == node {
            index = i
            break
        }
    }
    var brother *btree_node
    var parent_index int
    var brother_index int
    if index == 0 {
        brother = node.parent.child[1]
        parent_index = 0
        brother_index = 0
    } else if index == num {
        brother = node.parent.child[num-1]
        parent_index = num - 1
        brother_index = brother.num - 1
    } else {
        brother1 := node.parent.child[index-1]
        brother2 := node.parent.child[index+1]
        if brother1.num > brother2.num {
            brother = brother1
            parent_index = index - 1
            brother_index = brother.num - 1
        } else {
            brother = brother2
            parent_index = index
            brother_index = 0
        }
    }
    return brother, brother_index, parent_index, index
}

func merge(tree *btree, node1 *btree_node, node2 *btree_node, parentIndex int) {
    i := node1.num
    j := 0
    for j < node2.num {
        node1.key[i] = node2.key[j]
        node1.child[i] = node2.child[j]
        i++
        j--
        node1.num++
    }

    i = parentIndex

    for i < node1.parent.num-1 {
        node1.parent.key[i] = node1.parent.key[i+1]
        node1.parent.child[i+1] = node1.parent.child[i+2]
    }
    node1.parent.num--

    if node1.parent.num <= tree.min {
        node := node1.parent
        brother, _, parent_index, node_index := find_brother(tree, node)
        if parent_index < node_index {
            brother.key[brother.num] = brother.parent.key[parent_index]
            merge(tree, brother, node, parent_index)
        } else {
            node.key[node.num] = node.parent.key[parent_index]
            merge(tree, node, brother, parent_index)
        }
    }

}

func check_is_min(tree *btree, node *btree_node, index int) {
    if node.num > tree.min {
        node.key[index] = 0
        node.num--
    } else {
        brother, brother_index, parent_index, node_index := find_brother(tree, node)
        if brother.num > tree.min {
            node.key[index] = node.parent.key[parent_index]
            node.parent.key[parent_index] = brother.key[brother_index]
            node, index = delete_node_index(brother, brother_index)
            check_is_min(tree, node, index)
        } else {
            node.key[index] = node.parent.key[parent_index]
            if parent_index < node_index {
                merge(tree, brother, node, parent_index)
            } else {
                merge(tree, node, brother, parent_index)
            }
        }

    }
}

func delete(tree *btree, key int) {
    node := tree.root
    index := 0
    node, index = find_node_index(node, key)
    if node == nil {
        fmt.Println("can not find the key ", key)
        return
    }
    fmt.Println("find the key ", key, index)

    if node == tree.root {
        node.key[index] = 0
        node.num--
        return
    }

    node, index = delete_node_index(node, index)

    check_is_min(tree, node, index)

}

func insert(tree *btree, key int) {
    node := tree.root
    for node != nil {
        //      fmt.Println(key)
        index, error_msg := find_insert_index(node, key)
        //      fmt.Println(index)

        if error_msg != nil {
            fmt.Println(index, error_msg)
            return
        }

        if node.child[index] == nil {
            insert_key(node, key, index)
            for node.num > tree.max {
                //              fmt.Println(node)
                if node.parent == nil {
                    new_root_node := new_node(tree)
                    node.parent = new_root_node
                    tree.root = new_root_node
                    new_root_node.child[0] = node
                }
                child_index := find_child_index(node.parent, node)
                select_key := node.key[tree.sidx]
                new_right_node := new_node(tree)
                cut_node(node, tree.sidx+1, new_right_node)
                new_right_node.parent = node.parent
                insert_key(node.parent, select_key, child_index)
                node.key[tree.sidx] = 0
                node.num--
                insert_child(node.parent, new_right_node, child_index+1)
                node = node.parent
            }
            return
        } else {
            node = node.child[index]
        }
    }
}

func printAll(tree *btree) {
    fmt.Println(tree.root)
    for i, v1 := range tree.root.child {
        if v1 != nil {
            fmt.Println(i, v1)
            for i, v2 := range v1.child {
                if v2 != nil {
                    fmt.Println(i, v2)
                }
            }
        }
    }
}

func Do() {
    new_btree := new_btree(10)
    new_node := new_node(new_btree)
    new_btree.root = new_node
    new_btree.first = new_node

    printAll(new_btree)

    for i := 0; i < 1000; i++ {
        key := rand.Intn(10000000)
        //      fmt.Println(key)
        insert(new_btree, key)
        //      printAll(new_btree)
    }

    printAll(new_btree)
    fmt.Println(new_btree.first)

    delete(new_btree, 1000)
    delete(new_btree, 7649444)
    delete(new_btree, 7866383)
    printAll(new_btree)
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容