红黑树(未验证)

Posted 氓浅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了红黑树(未验证)相关的知识,希望对你有一定的参考价值。

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)
}

以上是关于红黑树(未验证)的主要内容,如果未能解决你的问题,请参考以下文章

C++红黑树

C++红黑树

C++红黑树

手撕STL红黑树

手撕STL红黑树

C++之红黑树