bintrees.nim 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. discard """
  2. retries: 2
  3. """
  4. # -*- nim -*-
  5. import os, strutils
  6. type
  7. PNode = ref TNode
  8. TNode {.final, acyclic.} = object
  9. left, right: PNode
  10. item: int
  11. proc checkTree(node: PNode): int =
  12. result = node.item
  13. if node.left != nil:
  14. inc result, checkTree(node.left) - checkTree(node.right)
  15. proc makeTreeAux(item, depth: int): PNode =
  16. new(result)
  17. result.item = item
  18. if depth > 0:
  19. result.left = makeTreeAux(2 * item - 1, depth - 1)
  20. result.right = makeTreeAux(2 * item, depth - 1)
  21. proc makeTree(item, depth: int): PNode =
  22. #GC_disable()
  23. result = makeTreeAux(item, depth)
  24. #GC_enable()
  25. proc main =
  26. var n = parseInt(paramStr(1))
  27. const minDepth = 4
  28. var maxDepth = if minDepth+2 > n: minDepth+2 else: n
  29. var stretchDepth = maxDepth + 1
  30. echo("stretch tree of depth ", stretchDepth, "\t check: ", checkTree(
  31. makeTree(0, stretchDepth)))
  32. var longLivedTree = makeTree(0, maxDepth)
  33. var iterations = 1 shl maxDepth
  34. for depth in countup (minDepth, stretchDepth-1, 2):
  35. var check = 0
  36. for i in 1..iterations:
  37. check += checkTree(makeTree(i, depth)) + checkTree(makeTree(-i, depth))
  38. echo(iterations*2, "\t trees of depth ", depth, "\t check: ", check)
  39. iterations = iterations div 4
  40. echo("long lived tree of depth ", maxDepth, "\t check: ",
  41. longLivedTree.checkTree)
  42. echo GC_getstatistics()
  43. main()