ZBLOG

go 语言根据下面定义实现红黑树, 并实现插入、删除、前种后序遍历方法 // 红黑树节点的颜色 const ( red bool = false black bool = true ) // Node 节点结构体 type Node struct { value interface{} // 节点值 color bool // 节点颜色 left *Node // 左子节点 right *Node // 右子节点 par...

红黑树的实现:

package rbtree

// 红黑树节点的颜色
const (
	red   bool = false
	black bool = true
)

// Node 节点结构体
type Node struct {
	value  interface{} // 节点值
	color  bool        // 节点颜色
	left   *Node       // 左子节点
	right  *Node       // 右子节点
	parent *Node       // 父节点
}

func (n *Node) getNodeSumNoIndex() int64 {
	return n.value.(*FileDeploy).SumNoIndex
}

// RBTree 红黑树结构体
type RBTree struct {
	root *Node // 根节点
}

// newNode 新建一个节点
func newNode(value interface{}) *Node {
	return &Node{
		value: value,
		color: red,
	}
}

// isRed 判断节点颜色是否为红色
func isRed(n *Node) bool {
	if n == nil {
		return false
	}
	return n.color == red
}

// rotateLeft 左旋
func rotateLeft(n *Node) *Node {
	if n == nil || n.right == nil {
		return n
	}
	r := n.right
	n.right = r.left
	if r.left != nil {
		r.left.parent = n
	}
	r.parent = n.parent
	if n.parent == nil {
		r.parent = nil
	} else if n.parent.left == n {
		n.parent.left = r
	} else {
		n.parent.right = r
	}
	r.left = n
	n.parent = r
	return r
}

// rotateRight 右旋
func rotateRight(n *Node) *Node {
	if n == nil || n.left == nil {
		return n
	}
	l := n.left
	n.left = l.right
	if l.right != nil {
		l.right.parent = n
	}
	l.parent = n.parent
	if n.parent == nil {
		l.parent = nil
	} else if n.parent.left == n {
		n.parent.left = l
	} else {
		n.parent.right = l
	}
	l.right = n
	n.parent = l
	return l
}

// flipColor 颜色翻转
func flipColor(n *Node) {
	n.color = !n.color
	if n.left != nil {
		n.left.color = !n.left.color
	}
	if n.right != nil {
		n.right.color = !n.right.color
	}
}

// Insert 插入节点
func (t *RBTree) Insert(value interface{}) {
	if t.root == nil {
		t.root = newNode(value)
		t.root.color = black
		return
	}
	var parent *Node
	node := t.root
	for node != nil {
		parent = node
		if node.getNodeSumNoIndex() < value.(*FileDeploy).SumNoIndex {
			node = node.right
		} else {
			node = node.left
		}
	}
	newNode := newNode(value)
	newNode.parent = parent
	if parent.getNodeSumNoIndex() < newNode.getNodeSumNoIndex() {
		parent.right = newNode
	} else {
		parent.left = newNode
	}
	insertFixup(newNode, t)
}

// insertFixup 节点插入后的修复操作
func insertFixup(n *Node, t *RBTree) {
	for isRed(n.parent) {
		if n.parent == n.parent.parent.left {
			y := n.parent.parent.right
			if isRed(y) {
				n.parent.color = black
				y.color = black
				n.parent.parent.color = red
				n = n.parent.parent
			} else {
				if n == n.parent.right {
					n = n.parent
					t.root = rotateLeft(n)
				}
				n.parent.color = black
				n.parent.parent.color = red
				t.root = rotateRight(n.parent.parent)
			}
		} else {
			y := n.parent.parent.left
			if isRed(y) {
				n.parent.color = black
				y.color = black
				n.parent.parent.color = red
				n = n.parent.parent
			} else {
				if n == n.parent.left {
					n = n.parent
					t.root = rotateRight(n)
				}
				n.parent.color = black
				n.parent.parent.color = red
				t.root = rotateLeft(n.parent.parent)
			}
		}
	}
	t.root.color = black
}

// Delete 删除节点
func (t *RBTree) Delete(value interface{}) {
	node := t.Search(value)
	if node == nil {
		return
	}
	var replaceNode *Node // 被删除节点的替换节点
	var replaceColor bool // 被删除节点的替换节点的颜色
	if node.left == nil {
		replaceNode = node.right
		transplant(node, node.right, t)
	} else if node.right == nil {
		replaceNode = node.left
		transplant(node, node.left, t)
	} else {
		min := minimum(node.right)
		replaceNode = min.right
		replaceColor = min.color
		if min.parent == node {
			replaceNode.parent = min
		} else {
			transplant(min, min.right, t)
			min.right = node.right
			min.right.parent = min
		}
		transplant(node, min, t)
		min.left = node.left
		min.left.parent = min
		min.color = node.color
	}
	if replaceColor == black {
		deleteFixup(replaceNode, t)
	}
}

// transplant 替换节点
func transplant(n1, n2 *Node, t *RBTree) {
	if n1.parent == nil {
		t.root = n2
	} else if n1 == n1.parent.left {
		n1.parent.left = n2
	} else {
		n1.parent.right = n2
	}
	if n2 != nil {
		n2.parent = n1.parent
	}
}

// deleteFixup 删除节点后的修复操作
func deleteFixup(n *Node, t *RBTree) {
	for n != t.root && !isRed(n) {
		if n == n.parent.left {
			s := n.parent.right
			if isRed(s) {
				s.color = black
				n.parent.color = red
				t.root = rotateLeft(n.parent)
				s = n.parent.right
			}
			if !isRed(s.left) && !isRed(s.right) {
				s.color = red
				n = n.parent
			} else {
				if !isRed(s.right) {
					s.left.color = black
					s.color = red
					t.root = rotateRight(s)
					s = n.parent.right
				}
				s.color = n.parent.color
				n.parent.color = black
				s.right.color = black
				t.root = rotateLeft(n.parent)
				n = t.root
			}
		} else {
			s := n.parent.left
			if isRed(s) {
				s.color = black
				n.parent.color = red
				t.root = rotateRight(n.parent)
				s = n.parent.left
			}
			if !isRed(s.left) && !isRed(s.right) {
				s.color = red
				n = n.parent
			} else {
				if !isRed(s.left) {
					s.right.color = black
					s.color = red
					t.root = rotateLeft(s)
					s = n.parent.left
				}
				s.color = n.parent.color
				n.parent.color = black
				s.left.color = black
				t.root = rotateRight(n.parent)
				n = t.root
			}
		}
	}
	n.color = black
}

// minimum 查找最小值节点
func minimum(n *Node) *Node {
	for n.left != nil {
		n = n.left
	}
	return n
}

// Search 查找节点
func (t *RBTree) Search(value interface{}) *Node {
	node := t.root
	for node != nil {
		if node.getNodeSumNoIndex() == value.(*FileDeploy).SumNoIndex {
			return node
		} else if node.getNodeSumNoIndex() < value.(*FileDeploy).SumNoIndex {
			node = node.right
		} else {
			node = node.left
		}
	}
	return nil
}

// PreOrder 前序遍历
func (t *RBTree) PreOrder() []interface{} {
	res := make([]interface{}, 0)
	var preOrder func(*Node)
	preOrder = func(n *Node) {
		if n == nil {
			return
		}
		res = append(res, n.value)
		preOrder(n.left)
		preOrder(n.right)
	}
	preOrder(t.root)
	return res
}

// InOrder 中序遍历
func (t *RBTree) InOrder() []interface{} {
	res := make([]interface{}, 0)
	var inOrder func(*Node)
	inOrder = func(n *Node) {
		if n == nil {
			return
		}
		inOrder(n.left)
		res = append(res, n.value)
		inOrder(n.right)
	}
	inOrder(t.root)
	return res
}

// PostOrder 后序遍历
func (t *RBTree) PostOrder() []interface{} {
	res := make([]interface{}, 0)
	var postOrder func(*Node)
	postOrder = func(n *Node) {
		if n == nil {
			return
		}
		postOrder(n.left)
		postOrder(n.right)
		res = append(res, n.value)
	}
	postOrder(t.root)
	return res
}

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=1656

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?