170 lines
2.4 KiB
Go
170 lines
2.4 KiB
Go
|
package binaryTree
|
|||
|
|
|||
|
//二叉树
|
|||
|
//二叉树是每个节点最多有两个子树的树结构
|
|||
|
type ElementType int //节点数据
|
|||
|
//结点
|
|||
|
type Node struct {
|
|||
|
Value ElementType
|
|||
|
Parent *Node
|
|||
|
Left *Node
|
|||
|
Right *Node
|
|||
|
}
|
|||
|
|
|||
|
//创建节点
|
|||
|
func NewNode(v ElementType) *Node {
|
|||
|
return &Node{Value: v}
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
*节点比较
|
|||
|
* n>m:1 n<m:-1 n=m:0
|
|||
|
*/
|
|||
|
func (n *Node) Compare(m *Node) int {
|
|||
|
if n.Value < m.Value {
|
|||
|
return -1
|
|||
|
} else if n.Value > m.Value {
|
|||
|
return 1
|
|||
|
} else {
|
|||
|
return 0
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//树
|
|||
|
type Tree struct {
|
|||
|
Head *Node
|
|||
|
Size int
|
|||
|
}
|
|||
|
|
|||
|
//创建树
|
|||
|
func NewTree(n *Node) *Tree {
|
|||
|
if n == nil {
|
|||
|
return &Tree{}
|
|||
|
}
|
|||
|
return &Tree{Head: n, Size: 1}
|
|||
|
}
|
|||
|
|
|||
|
//插入,相同的节点值,放到右子树
|
|||
|
func (t *Tree) Insert(i ElementType) {
|
|||
|
n := NewNode(i) //创建节点
|
|||
|
if t.Head == nil { //判断树的根节点
|
|||
|
t.Head = n
|
|||
|
t.Size++
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
h := t.Head
|
|||
|
|
|||
|
for {
|
|||
|
if n.Compare(h) == -1 { //小于parent,到左子节点
|
|||
|
if h.Left == nil { //无左子节点
|
|||
|
h.Left = n
|
|||
|
n.Parent = h
|
|||
|
break
|
|||
|
} else {
|
|||
|
h = h.Left
|
|||
|
}
|
|||
|
} else { //大于parent
|
|||
|
if h.Right == nil {
|
|||
|
h.Right = n
|
|||
|
n.Parent = h
|
|||
|
break
|
|||
|
} else {
|
|||
|
h = h.Right
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
t.Size++
|
|||
|
}
|
|||
|
|
|||
|
//搜索
|
|||
|
func (t *Tree) Search(i ElementType) *Node {
|
|||
|
h := t.Head
|
|||
|
n := NewNode(i)
|
|||
|
for h != nil {
|
|||
|
switch h.Compare(n) {
|
|||
|
case -1:
|
|||
|
h = h.Right
|
|||
|
case 1:
|
|||
|
h = h.Left
|
|||
|
case 0:
|
|||
|
return h
|
|||
|
default:
|
|||
|
panic("Node not found")
|
|||
|
}
|
|||
|
}
|
|||
|
panic("Node not found")
|
|||
|
}
|
|||
|
|
|||
|
//删除
|
|||
|
func (t *Tree) Delete(i ElementType) bool {
|
|||
|
var parent *Node
|
|||
|
|
|||
|
h := t.Head
|
|||
|
n := NewNode(i)
|
|||
|
|
|||
|
for h != nil {
|
|||
|
switch n.Compare(h) {
|
|||
|
case -1:
|
|||
|
parent = h
|
|||
|
h = h.Left
|
|||
|
case 1:
|
|||
|
parent = h
|
|||
|
h = h.Right
|
|||
|
case 0:
|
|||
|
if h.Left != nil {
|
|||
|
right := h.Right
|
|||
|
h.Value = h.Left.Value
|
|||
|
h.Left = h.Left.Left
|
|||
|
h.Right = h.Left.Right
|
|||
|
|
|||
|
if right != nil {
|
|||
|
subTree := &Tree{Head: h}
|
|||
|
IterOnTree(right, func(n *Node) {
|
|||
|
subTree.Insert(n.Value)
|
|||
|
})
|
|||
|
}
|
|||
|
t.Size--
|
|||
|
return true
|
|||
|
}
|
|||
|
|
|||
|
if h.Right != nil {
|
|||
|
h.Value = h.Right.Value
|
|||
|
h.Left = h.Right.Left
|
|||
|
h.Right = h.Right.Right
|
|||
|
|
|||
|
t.Size--
|
|||
|
return true
|
|||
|
}
|
|||
|
|
|||
|
if parent == nil {
|
|||
|
t.Head = nil
|
|||
|
t.Size--
|
|||
|
return true
|
|||
|
}
|
|||
|
|
|||
|
if parent.Left == n {
|
|||
|
parent.Left = nil
|
|||
|
} else {
|
|||
|
parent.Right = nil
|
|||
|
}
|
|||
|
t.Size--
|
|||
|
return true
|
|||
|
}
|
|||
|
}
|
|||
|
return false
|
|||
|
}
|
|||
|
|
|||
|
func IterOnTree(n *Node, f func(*Node)) bool {
|
|||
|
if n == nil {
|
|||
|
return true
|
|||
|
}
|
|||
|
if !IterOnTree(n.Left, f) {
|
|||
|
return false
|
|||
|
}
|
|||
|
|
|||
|
f(n)
|
|||
|
|
|||
|
return IterOnTree(n.Right, f)
|
|||
|
}
|