github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/petar/GoLLRB/llrb/llrb-stats.go (about) 1 // Copyright 2010 Petar Maymounkov. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package llrb 6 7 // GetHeight() returns an item in the tree with key @key, and it's height in the tree 8 func (t *LLRB) GetHeight(key Item) (result Item, depth int) { 9 return t.getHeight(t.root, key) 10 } 11 12 func (t *LLRB) getHeight(h *Node, item Item) (Item, int) { 13 if h == nil { 14 return nil, 0 15 } 16 if less(item, h.Item) { 17 result, depth := t.getHeight(h.Left, item) 18 return result, depth + 1 19 } 20 if less(h.Item, item) { 21 result, depth := t.getHeight(h.Right, item) 22 return result, depth + 1 23 } 24 return h.Item, 0 25 } 26 27 // HeightStats() returns the average and standard deviation of the height 28 // of elements in the tree 29 func (t *LLRB) HeightStats() (avg, stddev float64) { 30 av := &avgVar{} 31 heightStats(t.root, 0, av) 32 return av.GetAvg(), av.GetStdDev() 33 } 34 35 func heightStats(h *Node, d int, av *avgVar) { 36 if h == nil { 37 return 38 } 39 av.Add(float64(d)) 40 if h.Left != nil { 41 heightStats(h.Left, d+1, av) 42 } 43 if h.Right != nil { 44 heightStats(h.Right, d+1, av) 45 } 46 }