Advertisement
Guest User

Untitled

a guest
Apr 27th, 2015
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.79 KB | None | 0 0
  1. (function(root) {
  2. "use strict";
  3. var RED = 0, BLACK = 1;
  4. function Tree(color, left, key, value, right) {
  5. this.color = color;
  6. this.left = left;
  7. this.right = right;
  8. this.key = key;
  9. this.value = value;
  10. }
  11. Tree.prototype.has = function(key) {
  12. if (key < this.key) {
  13. return this.left.has(key);
  14. } else if (key > this.key) {
  15. return this.right.has(key);
  16. } else {
  17. return true;
  18. }
  19. };
  20. Tree.prototype.add = function(key, value) {
  21. if (key < this.key) {
  22. return this.$Tree_balance(this.color, this.left.add(key, value), this.key, this.value, this.right);
  23. } else if (key > this.key) {
  24. return this.$Tree_balance(this.color, this.left, this.key, this.value, this.right.add(key, value));
  25. } else {
  26. return new Tree(this.color, this.left, this.key, value, this.right);
  27. }
  28. };
  29. Tree.prototype.$Tree_balance = function(color, left, key, value, right) {
  30. if (color === BLACK) {
  31. if (left instanceof Tree && left.color === RED) {
  32. if (left.left instanceof Tree && left.left.color === RED) {
  33. var level2 = left.left, l = new Tree(BLACK, level2.left, level2.key, level2.value, level2.right), r = new Tree(BLACK, left.right, key, value, right);
  34. return new Tree(RED, l, left.key, left.value, r);
  35. } else if (left.right instanceof Tree && left.right.color === RED) {
  36. var level2 = left.right, l = new Tree(BLACK, left.left, left.key, left.value, level2.left), r = new Tree(BLACK, level2.right, key, value, right);
  37. return new Tree(RED, l, level2.key, level2.value, r);
  38. }
  39. } else if (right instanceof Tree && right.color === RED) {
  40. if (right.left instanceof Tree && right.left.color === RED) {
  41. var level2 = right.left, l = new Tree(BLACK, left, key, value, level2.left), r = new Tree(BLACK, level2.right, right.key, right.value, right.right);
  42. return new Tree(RED, l, level2.key, level2.value, r);
  43. } else if (right.right instanceof Tree && right.right.color === RED) {
  44. var level2 = right.right;
  45. l = new Tree(BLACK, left, key, value, right.left);
  46. r = new Tree(BLACK, level2.left, level2.key, level2.value, level2.right);
  47. return new Tree(RED, l, right.key, right.value, level2.right);
  48. }
  49. }
  50. }
  51. return new Tree(color, left, key, value, right);
  52. };
  53. Tree.prototype.get = function(key) {
  54. if (key < this.key) {
  55. return this.left.get(key);
  56. } else if (key > this.key) {
  57. return this.right.get(key);
  58. } else {
  59. return this.value;
  60. }
  61. };
  62. Tree.prototype.count = function() {
  63. return this.left.count() + 1 + this.right.count();
  64. };
  65. Tree.prototype.iter = function(fn) {
  66. this.left.iter(fn);
  67. fn(this.key, this.value);
  68. this.right.iter(fn);
  69. };
  70. Tree.prototype.map = function(fn) {
  71. var left = this.left.map(fn), value = fn(this.key, this.value), right = this.right.map(fn);
  72. return new Tree(this.color, left, this.key, value, right);
  73. };
  74. Tree.prototype.reduce = function(fn, acc) {
  75. acc = this.left.reduce(fn, acc);
  76. acc = fn(this.key, this.value, acc);
  77. return this.right.reduce(fn, acc);
  78. };
  79. Tree.prototype.toObject = function() {
  80. var obj = {};
  81. this.iter(function(k, v) {
  82. obj[k] = v;
  83. });
  84. return obj;
  85. };
  86. function Empty() {}
  87. Empty.prototype.has = function(key) {
  88. return false;
  89. };
  90. Empty.prototype.add = function(key, value) {
  91. return new Tree(RED, empty, key, value, empty);
  92. };
  93. Empty.prototype.get = function(key) {
  94. return null;
  95. };
  96. Empty.prototype.count = function() {
  97. return 0;
  98. };
  99. Empty.prototype.iter = function(fn) {};
  100. Empty.prototype.map = function(fn) {
  101. return this;
  102. };
  103. Empty.prototype.reduce = function(fn, acc) {
  104. return acc;
  105. };
  106. Empty.prototype.toObject = function() {
  107. return {};
  108. };
  109. var empty = new Empty();
  110. function fromObject(obj) {
  111. var t = empty;
  112. for (var key in obj) {
  113. if (obj.hasOwnProperty(key)) {
  114. t = t.add(key, obj[key]);
  115. }
  116. }
  117. return t;
  118. }
  119. var moduleObj = {
  120. empty: empty,
  121. RBTree: Tree,
  122. fromObject: fromObject
  123. };
  124. if (typeof exports !== "undefined") {
  125. if (typeof module !== "undefined" && module.exports) {
  126. exports = module.exports = moduleObj;
  127. } else {
  128. root.rbtree = moduleObj;
  129. }
  130. }
  131. })(this);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement