baltree.rig 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. -- Balanced tree
  2. -- This program takes list of numbers, produced by random
  3. -- number generator and puts them to balanced tree.
  4. -- Then it traverses the balanced tree and outputs the
  5. -- numbers in increasing order.
  6. #MAIN
  7. $limit:=50;
  8. $numlist:=#gen_random_list($limit);
  9. $baltree:=#list_2_bal_tree($numlist);
  10. $ordered_list:=#bal_tree_2_list($baltree);
  11. PRINT $numlist;
  12. PRINT $ordered_list;
  13. ##
  14. #gen_random_list $limit
  15. -- $limit - how many numbers to generate
  16. /#CALL_PAS(19); -- Randomize. Sets internal random generator
  17. -- to seed depending on currernt time.
  18. LOOP
  19. IF $limit<=0 -> RETURN $res FI;
  20. $res!.:=#CALL_PAS(20 100); -- returns random integer in 0..99
  21. $limit+:=-1; -- normal way how to do FOR-loops in Rigal
  22. END /
  23. ##
  24. #list_2_bal_tree
  25. (. $first
  26. / $tree:=<. 'val': $first .> /
  27. (* $other / #insert ( $tree $other ) /
  28. *)
  29. .)
  30. / RETURN $tree /
  31. ##
  32. #insert $tree $newval
  33. -- $tree - a balanced tree node. It cannot be NULL.
  34. -- $newval - value added to the tree.
  35. / IF $newval=$tree.val -> RETURN t FI;
  36. -- if duplicates come, they are ignored
  37. IF $newval<$tree.val ->
  38. IF $tree.left -> #insert($tree.left $newval)
  39. ELSIF T -> $tree ++:=<. left: <. val: $newval .> .>
  40. FI
  41. ELSIF T ->
  42. IF $tree.right -> #insert($tree.right $newval)
  43. ELSIF T -> $tree ++:=<. right: <. val: $newval .> .>
  44. FI
  45. FI /
  46. ##
  47. #bal_tree_2_list
  48. <. [ left : $list!!:=#bal_tree_2_list ],
  49. val : $list !.:=$the_val,
  50. [ right : $list!!:=#bal_tree_2_list ]
  51. .>
  52. /RETURN $list/
  53. ##