-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCompleteTree.go
More file actions
151 lines (125 loc) · 2.73 KB
/
CompleteTree.go
File metadata and controls
151 lines (125 loc) · 2.73 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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/**
*
* @Name: Complete Tree Implementation in Go By Linked List
* @Author: Max Base
* @Repository: https://github.com/BaseMax/CompleteTreeLinkedListGo
* @License: GPL-3.0
* @Date: 2022/12/24
*
**/
package main
import "fmt"
type Node struct {
value int
left *Node
right *Node
}
type CompleteTree struct {
root *Node
}
/**
* build a complete tree
*/
func NewCompleteTree() *CompleteTree {
return &CompleteTree{}
}
/**
* insert a new node to complete tree
*/
func (h *CompleteTree) Insert(value int) {
if h.root == nil {
h.root = &Node{value: value}
return
}
h.insert(h.root, value)
}
func (h *CompleteTree) insert(n *Node, value int) {
if n.left == nil {
n.left = &Node{value: value}
return
}
if n.right == nil {
n.right = &Node{value: value}
return
}
h.insert(n.left, value)
}
/**
* insert a new node to complete tree by filling from left to right (per row)
*/
func (h *CompleteTree) InsertClean(value int) {
if h.root == nil {
h.root = &Node{value: value}
return
}
h.insertClean(h.root, value)
}
func (h *CompleteTree) insertClean(n *Node, value int) {
if n.left == nil {
n.left = &Node{value: value}
return
}
if n.right == nil {
n.right = &Node{value: value}
return
}
h.insertClean(n.left, value)
if n.left != nil {
h.insertClean(n.right, value)
}
}
/**
* print complete tree
*/
func (h *CompleteTree) Print() {
// print the complete tree by using ASCII art
h.print(h.root, 0)
}
func (h *CompleteTree) print(n *Node, level int) {
if n == nil {
return
}
h.print(n.right, level+1)
for i := 0; i < level; i++ {
print(" ")
}
print(n.value)
print(" ")
print(" ")
print("\n")
h.print(n.left, level+1)
}
func main() {
// Create a new complete tree
CompleteTree := NewCompleteTree()
// Insert some values
CompleteTree.Insert(1)
CompleteTree.Insert(2)
CompleteTree.Insert(3)
CompleteTree.Insert(4)
CompleteTree.Insert(5)
CompleteTree.Insert(6)
CompleteTree.Insert(7)
CompleteTree.Insert(8)
CompleteTree.Insert(9)
CompleteTree.Insert(10)
// Print complete tree
CompleteTree.Print()
fmt.Println("======================================")
fmt.Println("======================================")
// Create another complete tree
CompleteTree2 := NewCompleteTree()
// Insert some values
CompleteTree2.InsertClean(10)
CompleteTree2.InsertClean(9)
CompleteTree2.InsertClean(8)
CompleteTree2.InsertClean(7)
CompleteTree2.InsertClean(6)
CompleteTree2.InsertClean(5)
CompleteTree2.InsertClean(4)
CompleteTree2.InsertClean(3)
CompleteTree2.InsertClean(2)
CompleteTree2.InsertClean(1)
// Print the tree
CompleteTree2.Print()
}