...
1
2
3
4
32
33
39
40 package main
41
42 import (
43 "flag"
44 "fmt"
45 )
46
47 var n = flag.Int("n", 15, "depth")
48
49 type Node struct {
50 item int
51 left, right *Node
52 }
53
54 type Arena struct {
55 head *Node
56 }
57
58 var arena Arena
59
60 func (n *Node) free() {
61 if n.left != nil {
62 n.left.free()
63 }
64 if n.right != nil {
65 n.right.free()
66 }
67 n.left = arena.head
68 arena.head = n
69 }
70
71 func (a *Arena) New(item int, left, right *Node) *Node {
72 if a.head == nil {
73 nodes := make([]Node, 3<<uint(*n))
74 for i := 0; i < len(nodes)-1; i++ {
75 nodes[i].left = &nodes[i+1]
76 }
77 a.head = &nodes[0]
78 }
79 n := a.head
80 a.head = a.head.left
81 n.item = item
82 n.left = left
83 n.right = right
84 return n
85 }
86
87 func bottomUpTree(item, depth int) *Node {
88 if depth <= 0 {
89 return arena.New(item, nil, nil)
90 }
91 return arena.New(item, bottomUpTree(2*item-1, depth-1), bottomUpTree(2*item, depth-1))
92 }
93
94 func (n *Node) itemCheck() int {
95 if n.left == nil {
96 return n.item
97 }
98 return n.item + n.left.itemCheck() - n.right.itemCheck()
99 }
100
101 const minDepth = 4
102
103 func main() {
104 flag.Parse()
105
106 maxDepth := *n
107 if minDepth+2 > *n {
108 maxDepth = minDepth + 2
109 }
110 stretchDepth := maxDepth + 1
111
112 check := bottomUpTree(0, stretchDepth).itemCheck()
113 fmt.Printf("stretch tree of depth %d\t check: %d\n", stretchDepth, check)
114
115 longLivedTree := bottomUpTree(0, maxDepth)
116
117 for depth := minDepth; depth <= maxDepth; depth += 2 {
118 iterations := 1 << uint(maxDepth-depth+minDepth)
119 check = 0
120
121 for i := 1; i <= iterations; i++ {
122 t := bottomUpTree(i, depth)
123 check += t.itemCheck()
124 t.free()
125 t = bottomUpTree(-i, depth)
126 check += t.itemCheck()
127 t.free()
128 }
129 fmt.Printf("%d\t trees of depth %d\t check: %d\n", iterations*2, depth, check)
130 }
131 fmt.Printf("long lived tree of depth %d\t check: %d\n", maxDepth, longLivedTree.itemCheck())
132 }
133
View as plain text