-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbst.go
More file actions
128 lines (120 loc) · 2.22 KB
/
bst.go
File metadata and controls
128 lines (120 loc) · 2.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package main
import (
"fmt"
"sync"
)
// 构建二叉树
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
// 构建二叉排序树
type BST struct {
Root *TreeNode
Lock sync.RWMutex
}
// 查询节点是否存在
func search(node *TreeNode, key int) bool {
if node == nil {
return false
}
if key == node.Val {
return true
} else if key > node.Val {
return search(node.Right, key)
} else {
return search(node.Left, key)
}
}
// 插入节点数据
func insert(node, addNode *TreeNode) {
if addNode.Val < node.Val {
if node.Left == nil {
node.Left = addNode
} else {
insert(node.Left, addNode)
}
} else {
if node.Right == nil {
node.Right = addNode
} else {
insert(node.Right, addNode)
}
}
}
// 插入节点
func (b *BST) insertNode(data int) {
b.Lock.Lock()
defer b.Lock.Unlock()
// 构建数据结构
treeNode := TreeNode{
Val: data,
Left: nil,
Right: nil,
}
if b.Root == nil {
b.Root = &treeNode
} else {
if !search(b.Root, data) {
insert(b.Root, &treeNode)
}
}
}
// 删除节点数据
func del(node *TreeNode, key int) *TreeNode {
if node == nil {
return nil
}
if key < node.Val {
node.Left = del(node.Left, key)
return node
} else if key > node.Val {
node.Right = del(node.Right, key)
return node
} else {
if node.Right == nil && node.Left == nil {
node = nil
return nil
}
if node.Right == nil {
node = node.Left
return node
} else if node.Left == nil {
node = node.Right
return node
} else {
// 找删除节点的后继节点
nodeRight := node.Right
for {
if nodeRight != nil && nodeRight.Left != nil {
nodeRight = nodeRight.Left
} else {
break
}
}
// nodeRight就是删除节点的后继节点
node.Val = nodeRight.Val
node.Right = del(node.Right, node.Val)
return node
}
}
}
// 删除节点
func (b *BST) deleteNode(key int) {
b.Lock.Lock()
defer b.Lock.Unlock()
del(b.Root, key)
}
func main() {
var (
binarySearchTree BST
a = [10]int{66, 88, 58, 47, 35, 73, 51, 99, 37, 93}
)
for _, i := range a {
binarySearchTree.insertNode(i)
}
fmt.Println(search(binarySearchTree.Root, 93))
binarySearchTree.deleteNode(93)
fmt.Println(search(binarySearchTree.Root, 93))
}