BinaryTrees.hx 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. class TreeNode {
  2. var left : TreeNode;
  3. var right : TreeNode;
  4. var item : Int;
  5. public function new(left,right,item){
  6. this.left = left;
  7. this.right = right;
  8. this.item = item;
  9. }
  10. public function itemCheck() {
  11. if( left == null) return item;
  12. return item + left.itemCheck() - right.itemCheck();
  13. }
  14. }
  15. @:result(26208)
  16. class BinaryTrees {
  17. static function bottomUpTree(item,depth){
  18. if (depth>0)
  19. return new TreeNode(
  20. bottomUpTree(2*item-1, depth-1)
  21. ,bottomUpTree(2*item, depth-1)
  22. ,item
  23. );
  24. return new TreeNode(null,null,item);
  25. }
  26. static function main() {
  27. var minDepth = 4;
  28. var n = 14;
  29. var maxDepth = Std.int(Math.max(minDepth + 2, n));
  30. var stretchDepth = maxDepth + 1;
  31. var check = bottomUpTree(0, stretchDepth).itemCheck();
  32. var result = check;
  33. var longLivedTree = bottomUpTree(0,maxDepth);
  34. var depth = minDepth;
  35. while( depth <= maxDepth ) {
  36. var iterations = 1 << (maxDepth - depth + minDepth);
  37. check = 0;
  38. for( i in 0...iterations ) {
  39. check += bottomUpTree(i,depth).itemCheck();
  40. check += bottomUpTree(-i,depth).itemCheck();
  41. }
  42. result ^= check;
  43. //console.log(iterations*2 + "\t trees of depth " + depth + "\t check: " + check);
  44. depth += 2;
  45. }
  46. result ^= longLivedTree.itemCheck();
  47. //console.log("long lived tree of depth " + maxDepth + "\t check: " + longLivedTree.itemCheck());
  48. Benchs.result(result);
  49. }
  50. }