BinaryTree.js
上传用户:kimgenplus
上传日期:2016-06-05
资源大小:20877k
文件大小:5k
源码类别:

OA系统

开发平台:

Java

  1. /*
  2. Copyright (c) 2004-2006, The Dojo Foundation
  3. All Rights Reserved.
  4. Licensed under the Academic Free License version 2.1 or above OR the
  5. modified BSD license. For more information on Dojo licensing, see:
  6. http://dojotoolkit.org/community/licensing.shtml
  7. */
  8. dojo.provide("dojo.collections.BinaryTree");
  9. dojo.require("dojo.collections.Collections");
  10. dojo.require("dojo.experimental");
  11. dojo.experimental("dojo.collections.BinaryTree");
  12. dojo.collections.BinaryTree = function (data) {
  13. function node(data, rnode, lnode) {
  14. this.value = data || null;
  15. this.right = rnode || null;
  16. this.left = lnode || null;
  17. this.clone = function () {
  18. var c = new node();
  19. if (this.value.value) {
  20. c.value = this.value.clone();
  21. } else {
  22. c.value = this.value;
  23. }
  24. if (this.left) {
  25. c.left = this.left.clone();
  26. }
  27. if (this.right) {
  28. c.right = this.right.clone();
  29. }
  30. };
  31. this.compare = function (n) {
  32. if (this.value > n.value) {
  33. return 1;
  34. }
  35. if (this.value < n.value) {
  36. return -1;
  37. }
  38. return 0;
  39. };
  40. this.compareData = function (d) {
  41. if (this.value > d) {
  42. return 1;
  43. }
  44. if (this.value < d) {
  45. return -1;
  46. }
  47. return 0;
  48. };
  49. }
  50. function inorderTraversalBuildup(current, a) {
  51. if (current) {
  52. inorderTraversalBuildup(current.left, a);
  53. a.add(current);
  54. inorderTraversalBuildup(current.right, a);
  55. }
  56. }
  57. function preorderTraversal(current, sep) {
  58. var s = "";
  59. if (current) {
  60. s = current.value.toString() + sep;
  61. s += preorderTraversal(current.left, sep);
  62. s += preorderTraversal(current.right, sep);
  63. }
  64. return s;
  65. }
  66. function inorderTraversal(current, sep) {
  67. var s = "";
  68. if (current) {
  69. s = inorderTraversal(current.left, sep);
  70. s += current.value.toString() + sep;
  71. s += inorderTraversal(current.right, sep);
  72. }
  73. return s;
  74. }
  75. function postorderTraversal(current, sep) {
  76. var s = "";
  77. if (current) {
  78. s = postorderTraversal(current.left, sep);
  79. s += postorderTraversal(current.right, sep);
  80. s += current.value.toString() + sep;
  81. }
  82. return s;
  83. }
  84. function searchHelper(current, data) {
  85. if (!current) {
  86. return null;
  87. }
  88. var i = current.compareData(data);
  89. if (i == 0) {
  90. return current;
  91. }
  92. if (i > 0) {
  93. return searchHelper(current.left, data);
  94. } else {
  95. return searchHelper(current.right, data);
  96. }
  97. }
  98. this.add = function (data) {
  99. var n = new node(data);
  100. var i;
  101. var current = root;
  102. var parent = null;
  103. while (current) {
  104. i = current.compare(n);
  105. if (i == 0) {
  106. return;
  107. }
  108. parent = current;
  109. if (i > 0) {
  110. current = current.left;
  111. } else {
  112. current = current.right;
  113. }
  114. }
  115. this.count++;
  116. if (!parent) {
  117. root = n;
  118. } else {
  119. i = parent.compare(n);
  120. if (i > 0) {
  121. parent.left = n;
  122. } else {
  123. parent.right = n;
  124. }
  125. }
  126. };
  127. this.clear = function () {
  128. root = null;
  129. this.count = 0;
  130. };
  131. this.clone = function () {
  132. var c = new dojo.collections.BinaryTree();
  133. c.root = root.clone();
  134. c.count = this.count;
  135. return c;
  136. };
  137. this.contains = function (data) {
  138. return this.search(data) != null;
  139. };
  140. this.deleteData = function (data) {
  141. var current = root;
  142. var parent = null;
  143. var i = current.compareData(data);
  144. while (i != 0 && current != null) {
  145. if (i > 0) {
  146. parent = current;
  147. current = current.left;
  148. } else {
  149. if (i < 0) {
  150. parent = current;
  151. current = current.right;
  152. }
  153. }
  154. i = current.compareData(data);
  155. }
  156. if (!current) {
  157. return;
  158. }
  159. this.count--;
  160. if (!current.right) {
  161. if (!parent) {
  162. root = current.left;
  163. } else {
  164. i = parent.compare(current);
  165. if (i > 0) {
  166. parent.left = current.left;
  167. } else {
  168. if (i < 0) {
  169. parent.right = current.left;
  170. }
  171. }
  172. }
  173. } else {
  174. if (!current.right.left) {
  175. if (!parent) {
  176. root = current.right;
  177. } else {
  178. i = parent.compare(current);
  179. if (i > 0) {
  180. parent.left = current.right;
  181. } else {
  182. if (i < 0) {
  183. parent.right = current.right;
  184. }
  185. }
  186. }
  187. } else {
  188. var leftmost = current.right.left;
  189. var lmParent = current.right;
  190. while (leftmost.left != null) {
  191. lmParent = leftmost;
  192. leftmost = leftmost.left;
  193. }
  194. lmParent.left = leftmost.right;
  195. leftmost.left = current.left;
  196. leftmost.right = current.right;
  197. if (!parent) {
  198. root = leftmost;
  199. } else {
  200. i = parent.compare(current);
  201. if (i > 0) {
  202. parent.left = leftmost;
  203. } else {
  204. if (i < 0) {
  205. parent.right = leftmost;
  206. }
  207. }
  208. }
  209. }
  210. }
  211. };
  212. this.getIterator = function () {
  213. var a = [];
  214. inorderTraversalBuildup(root, a);
  215. return new dojo.collections.Iterator(a);
  216. };
  217. this.search = function (data) {
  218. return searchHelper(root, data);
  219. };
  220. this.toString = function (order, sep) {
  221. if (!order) {
  222. var order = dojo.collections.BinaryTree.TraversalMethods.Inorder;
  223. }
  224. if (!sep) {
  225. var sep = " ";
  226. }
  227. var s = "";
  228. switch (order) {
  229.   case dojo.collections.BinaryTree.TraversalMethods.Preorder:
  230. s = preorderTraversal(root, sep);
  231. break;
  232.   case dojo.collections.BinaryTree.TraversalMethods.Inorder:
  233. s = inorderTraversal(root, sep);
  234. break;
  235.   case dojo.collections.BinaryTree.TraversalMethods.Postorder:
  236. s = postorderTraversal(root, sep);
  237. break;
  238. }
  239. if (s.length == 0) {
  240. return "";
  241. } else {
  242. return s.substring(0, s.length - sep.length);
  243. }
  244. };
  245. this.count = 0;
  246. var root = this.root = null;
  247. if (data) {
  248. this.add(data);
  249. }
  250. };
  251. dojo.collections.BinaryTree.TraversalMethods = {Preorder:1, Inorder:2, Postorder:3};