-
Notifications
You must be signed in to change notification settings - Fork 153
/
26_tree.go
90 lines (74 loc) · 1.51 KB
/
26_tree.go
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
package main
import "fmt"
type Data struct {
Root *Node
}
type Node struct {
Left *Node
Key int
Right *Node
}
func (tr *Tree) String() string {
return d.Root.String()
}
func (nd *Node) String() string {
if nd == nil {
return "[]"
}
s := ""
if nd.Left != nil {
s += nd.Left.String() + " "
}
s += fmt.Sprintf("%v", nd.Key)
if nd.Right != nil {
s += " " + nd.Right.String()
}
return "[" + s + "]"
}
func main() {
tree := new(Tree)
root := new(Node)
root.Key = 3
tree.Root = root
left := new(Node)
left.Key = 1
root.Left = left
right := new(Node)
right.Key = 5
root.Right = right
seven := new(Node)
seven.Key = 7
root.Right.Right = seven
/*
3
/ \
1 5
\
7
*/
fmt.Println("tree:", tree) // [[1] 3 [5 [7]]]
delete1(root)
fmt.Println("delete1(root) root:", root) // delete1(root) root: [[1] 3 [5 [7]]]
fmt.Println("delete1(root) tree:", tree) // delete1(root) tree: [[1] 3 [5 [7]]]
// but if we access directly
// you can update
root.Right = new(Node)
fmt.Println("root.Right = new(Node) tree:", tree)
// root.Right = new(Node) tree: [[1] 3 [0]]
delete2(root)
fmt.Println("delete2(root) root:", root) // delete2(root) root: [0]
fmt.Println("delete2(root) tree:", tree) // delete2(root) tree: [0]
}
func delete1(nd *Node) {
// even if nd is a pointer
// it ONLY copies the value
// of the tree address
nd = nil
// or
// nd = new(Node)
// setting nil to the address
// does not affect the original object
}
func delete2(nd *Node) {
*nd = Node{}
}