关于golang:红黑树未验证

51次阅读

共计 4273 个字符,预计需要花费 11 分钟才能阅读完成。

package main

import "fmt"

const (
    RED bool = true
    BLACK bool = false
)

type RBTree struct {root *Node}

func NewRBTree() *RBTree {return &RBTree{}
}

func (t *RBTree) Search (v int64) *Node {
    n := t.root
    for n != nil {
        if v < n.v {n = n.l} else if v >n.v {n = n.r} else {return n}
    }
    return nil
}

func (t *RBTree) Insert(v int64) {
    if t.root == nil {t.root = &Node{v:v, c:BLACK}
        return
    }
    n := t.root
    
    addNode := &Node{v:v, c:RED}
    
    var np *Node
    
    for n != nil {if (v == n.v) {return}
        
        np = n
        if v < n.v {n = n.l} else {n = n.r}
    }
    addNode.p = np
    if v < np.v {np.l = addNode} else {np.r = addNode}
    
    // 验证规定
    t.insertFix(addNode)
}

func (t *RBTree) insertFix(n *Node) {for !isBlack(n.p) {uncle := n.p.getBrother()
        if !isBlack(uncle) {
            n.p.c = BLACK
            uncle.c = BLACK
            uncle.p.c = RED
            n = n.p.p
            t.root.c = BLACK
            continue
        }
        if n.p == n.p.p.l {
            if n == n.p.l {
                n.p.p.c = RED
                n.p.c = BLACK
                n = n.p.p
                n.rTurn(t)
                t.root.c = BLACK
                continue
            }
            n = n.p
            n.lTurn(t)
            t.root.c = BLACK
            continue
        }
        if n == n.p.r {
            n.p.p.c = RED
            n.p.c = BLACK
            n = n.p.p
            n.lTurn(t)
            t.root.c = BLACK
            continue
        }
        n = n.p
        n.rTurn(t)
        t.root.c = BLACK
    }
}

func (t *RBTree) Del(v int64) {n := t.Search(v)
    np := n.p
    
    if n == nil {return}
    
    var revise string
    
    if n.l == nil && n.r == nil {revise = "none"} else if np == nil {revise = "root"} else if n == np.l {revise = "left"} else if n == np.r {revise = "right"}
    
    // 内含递归
    n.del(t)
    
    if isBlack(n) {
        if revise == "root" {t.delFix(t.root)
        } else if revise == "left" {t.delFix(np.l)
        } else if revise == "right" {t.delFix(np.r)
        }
    }
}

func (t *RBTree) delFix(n *Node) {
    var b *Node
    
    for n != t.root && isBlack(n) {
        
        // 删除节点为左节点,存在兄弟节点
        if n.p.l == n && n.p.r != nil {
            b = n.p.r
            if !isBlack(b) {
                b.c = BLACK
                n.p.c = RED
                n.p.lTurn(t)
            } else if isBlack(b) && b.l != nil && isBlack(b.l) && b.r != nil && isBlack(b.r){
                b.c = RED
                n = n.p
            } else if isBlack(b) && b.l != nil && !isBlack(b.l) && b.r != nil && isBlack(b.r) {
                b.c = RED
                b.l.c = BLACK
                b.rTurn(t)
            } else if isBlack(b) && b.r != nil && !isBlack(b.r) {
                b.c = RED
                b.r.c = BLACK
                b.p.c = BLACK
                b.p.lTurn(t)
                n = t.root
            }
        } else if n.p.r == n && n.p.l != nil {
            b = n.p.l
            if !isBlack(b) {
                b.c = BLACK
                n.p.c = RED
                n.p.rTurn(t)
            } else if isBlack(b) && b.l != nil && isBlack(b.l) && b.r != nil && isBlack(b.r) {
                b.c = RED
                n = n.p
            } else if isBlack(b) && b.l != nil && isBlack(b.l) && b.r != nil && !isBlack(b.r) {
                b.c = RED
                b.r.c = BLACK
                b.lTurn(t)
            } else if isBlack(b) && b.l != nil && !isBlack(b.l) {
                b.c = RED
                b.l.c = BLACK
                b.p.c = BLACK
                b.p.rTurn(t)
                n = t.root
            }
        } else {return}
    }
}

func (t *RBTree) min(n *Node) *Node {
    if n == nil {return nil}
    
    for n.l != nil {n = n.l}
    return n
}

func (t *RBTree) max(n *Node) *Node {
    if n == nil {return nil}
    for n.r != nil {n =n.r}
    return n
}

// 获取前驱节点
func (t *RBTree) getPredecessor(n *Node) *Node {
    if n == nil {return nil}
    // 小分支里的最大节点
    if n.l != nil {return t.max(n.l)
    }
    // 如果不存在又节点就从父节点中找
    for {
        if n.p == nil {break}
        if n == n.p.r {return n.p}
        n = n.p
    }
    return nil
}

// 获取继承节点
func (t *RBTree) getSuccessor(n *Node) *Node {
    if n == nil {return nil}
    
    // 大分支里的最小节点
    if n.r != nil {return t.min(n.r)
    }
    // 如果不存在又节点就从父节点中找
    for {
        if n.p == nil {break}
        if n == n.p.l {return n.p}
        n = n.p
    }
    return nil
}

/////////////////////////////////////

func isBlack(n *Node) bool {
    if n == nil {return true}
    return n.c == BLACK
}

func setColor(n *Node, color bool) {
    if n == nil {return}
    n.c = color
}

////////////////////////////////////////////////////////////

type Node struct {
    l, r, p *Node
    v int64
    c bool
}

func (n *Node) lTurn(t *RBTree) {
    if n == nil || n.r == nil {return}
    
    np := n.p
    nr := n.r
    
    // 父节点解决
    if np != nil {
        if n == np.l {np.l = nr} else {np.r = nr}
    } else {t.root = nr}
    
    
    // 解决本人关系
    n.p = nr
    n.r = nr.l
    if n.r != nil {
        // 左孙节点解决
        n.r.p = n
    }
    // 右子节点解决
    nr.l = n
    nr.p = np
}

func (n *Node) rTurn(t *RBTree) {
    if n == nil || n.l == nil {return}
    
    nl := n.l
    np := n.p
    
    // 父节点解决
    if np != nil {
        if n == np.l {np.l = nl} else {np.r = nl}
    } else {t.root = nl}
    
    // 解决本人关系
    n.p = nl
    n.l = nl.r
    if n.l != nil {
        // 右孙节点解决
        n.l.p = n
    }
    // 左子节点解决
    nl.r = n
    nl.p = np
    
}

func (n *Node) getBrother() *Node {
    if n.p == nil {return nil}
    if n.p.l == n {return n.p.r}
    if n.p.r == n {return n.p.l}
    return nil
}

func (n *Node) del(t *RBTree) {
    np := n.p
    
    if n.l == nil && n.r == nil {
        // 节点为尾部节点(不存在子节点)// 根节点、左尾节点、右尾节点
        if n == t.root {t.root = nil} else if np.l == n {np.l = nil} else {np.r = nil}
    } else if n.l != nil && n.r == nil {
        // 存在左子节点
        if n == t.root {
            // 根节点
            n.l.p = nil
            t.root = n.l
        } else {
            n.l.p = np
            if np.l == n {np.l = n.l} else {np.r = n.l}
        }
    } else if n.l == nil && n.r != nil {
        // 存在右子节点
        if n == t.root {
            n.r.p = nil
            t.root = n.r
        } else {
            n.r.p = np
            if np.l == n {np.l = n.r} else {np.r = n.r}
        }
    } else {
        // 存在两个节点
        successor := t.getSuccessor(n)
        n.v = successor.v
        n.c = successor.c
        
        // 递归删除
        successor.del(t)
    }
}

func main() {btree := NewRBTree()
    
    btree.Insert(1)
    btree.Insert(21)
    btree.Insert(3)
    btree.Insert(4)
    btree.Insert(5)
    btree.Insert(6)
    btree.Insert(7)
    btree.Insert(8)
    btree.Insert(9)
    btree.Insert(10)
    btree.Insert(1)
    
    fmt.Println(btree.Search(11))
    fmt.Println(btree.Search(10))
    fmt.Println(btree.Search(9))
    fmt.Println(btree.Search(8))
    fmt.Println(btree.Search(7))
    fmt.Println(btree.Search(6))
    fmt.Println(btree.Search(5))
    fmt.Println(btree.Search(4))
    fmt.Println(btree.Search(3))
    fmt.Println(btree.Search(21))
    fmt.Println(btree.Search(1))
    fmt.Println(btree.root)
}

正文完
 0