diff options
Diffstat (limited to 'middleware/file/tree/print.go')
-rw-r--r-- | middleware/file/tree/print.go | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/middleware/file/tree/print.go b/middleware/file/tree/print.go new file mode 100644 index 000000000..f098e56c7 --- /dev/null +++ b/middleware/file/tree/print.go @@ -0,0 +1,58 @@ +package tree + +import "fmt" + +// Print prints a Tree. Main use is to aid in debugging. +func (t *Tree) Print() { + if t.Root == nil { + fmt.Println("<nil>") + } + t.Root.print() +} + +func (n *Node) print() { + q := NewQueue() + q.Push(n) + + nodesInCurrentLevel := 1 + nodesInNextLevel := 0 + + for !q.Empty() { + do := q.Pop() + nodesInCurrentLevel-- + + if do != nil { + fmt.Print(do.Elem.Name(), " ") + q.Push(do.Left) + q.Push(do.Right) + nodesInNextLevel += 2 + } + if nodesInCurrentLevel == 0 { + fmt.Println() + } + nodesInCurrentLevel = nodesInNextLevel + nodesInNextLevel = 0 + } + fmt.Println() +} + +type queue []*Node + +func NewQueue() queue { + q := queue([]*Node{}) + return q +} + +func (q *queue) Push(n *Node) { + *q = append(*q, n) +} + +func (q *queue) Pop() *Node { + n := (*q)[0] + *q = (*q)[1:] + return n +} + +func (q *queue) Empty() bool { + return len(*q) == 0 +} |