csPost.js 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.csPost = csPost;
  6. var _csTdfs = require("./csTdfs.js");
  7. /**
  8. * Post order a tree of forest
  9. *
  10. * @param {Array} parent The tree or forest
  11. * @param {Number} n Number of columns
  12. *
  13. * Reference: http://faculty.cse.tamu.edu/davis/publications.html
  14. */
  15. function csPost(parent, n) {
  16. // check inputs
  17. if (!parent) {
  18. return null;
  19. }
  20. // vars
  21. var k = 0;
  22. var j;
  23. // allocate result
  24. var post = []; // (n)
  25. // workspace, head: first n entries, next: next n entries, stack: last n entries
  26. var w = []; // (3 * n)
  27. var head = 0;
  28. var next = n;
  29. var stack = 2 * n;
  30. // initialize workspace
  31. for (j = 0; j < n; j++) {
  32. // empty linked lists
  33. w[head + j] = -1;
  34. }
  35. // traverse nodes in reverse order
  36. for (j = n - 1; j >= 0; j--) {
  37. // check j is a root
  38. if (parent[j] === -1) {
  39. continue;
  40. }
  41. // add j to list of its parent
  42. w[next + j] = w[head + parent[j]];
  43. w[head + parent[j]] = j;
  44. }
  45. // loop nodes
  46. for (j = 0; j < n; j++) {
  47. // skip j if it is not a root
  48. if (parent[j] !== -1) {
  49. continue;
  50. }
  51. // depth-first search
  52. k = (0, _csTdfs.csTdfs)(j, k, w, head, next, post, stack);
  53. }
  54. return post;
  55. }