Advertisement
Guest User

tree.nim

a guest
Dec 23rd, 2018
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Nim 1.28 KB | None | 0 0
  1. import system,random
  2. discard """二分探索木
  3. 参照ノードより小さいノードは左部分木へ、大きいノードは右部分木へ
  4. ノード保持はref
  5. """
  6. type
  7.   Tree=ref NodeObj
  8.   NodeObj=object
  9.     left,right:Tree
  10.     elem:int
  11.  
  12. proc `$`(tree:Tree):string=
  13.   result=""
  14.   if tree.left!=nil:
  15.     result&= $(tree.left)
  16.   result&= $(tree.elem)&","
  17.   if tree.right!=nil:
  18.     result&= $(tree.right)
  19.   return result
  20.  
  21. proc build(arr:seq[int],dist:var Tree):void
  22.  
  23. var
  24.   root:Tree
  25.  
  26. var testdata:seq[int]
  27. testdata= @[0,1,2,3,4,5,6,7,8,9,10]
  28. randomize()
  29. for i in 0..10:
  30.   swap(testdata[i],testdata[i+rand(max=10-i)])
  31.  
  32. echo testdata
  33.  
  34. new(root)
  35. build(testdata,root)
  36. echo $root.left
  37.  
  38. proc build(arr:seq[int],dist:var Tree):void=
  39.   var
  40.     refnode:Tree
  41.     ref_old:Tree
  42.     lr:bool=false
  43.   for x in arr:
  44.     refnode=dist.left
  45.     ref_old=dist
  46. #    echo repr(refnode),"/",repr(ref_old)
  47.     while refnode!=nil:
  48.       if x<refnode.elem:
  49.         lr=false
  50.       elif refnode.elem<x:
  51.         lr=true
  52.       ref_old=refnode
  53.       if lr:
  54.         refnode=refnode.right
  55.       else:
  56.         refnode=refnode.left
  57.     if lr:
  58.       new(ref_old.right)
  59.       refnode=ref_old.right
  60.     else:
  61.       new(ref_old.left)
  62.       refnode=ref_old.left
  63.     refnode.elem=x
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement