Node.js examples for Data Structure:Tree
Depth First order on tree
/**// w w w .j a v a2s.co m * * Implement a `DFSelect` method on this Tree class. * * DFSelect accepts a filter function, calls that function on each of the nodes * in Depth First order, and returns a flat array of node values of the tree * for which the filter returns true. * * Example: * var root1 = new Tree(1); * var branch2 = root1.addChild(2); * var branch3 = root1.addChild(3); * var leaf4 = branch2.addChild(4); * var leaf5 = branch2.addChild(5); * var leaf6 = branch3.addChild(6); * var leaf7 = branch3.addChild(7); * root1.DFSelect(function (value, depth) { * return value % 2; * }) * // [1, 5, 3, 7] * * root1.DFSelect(function (value, depth) { * return depth === 1; * }) * // [2, 3] * */ /* * Basic tree that stores a value. */ var Tree = function(value) { this.value = value; this.children = []; }; Tree.prototype.DFSelect = function(filter) { var result = []; var depth = 0; var findChild = function(tree, depth) { if (filter(tree.value, depth)) { result.push(tree.value) } if (tree.children.length > 0) { for (var i = 0; i < tree.children.length; i++) { findChild(tree.children[i], depth + 1); } } } findChild(this, depth); return result; }; /** * add an immediate child * (wrap values in Tree nodes if they're not already) */ Tree.prototype.addChild = function(child) { if (!child || !(child instanceof Tree)) { child = new Tree(child); } if (!this.isDescendant(child)) { this.children.push(child); } else { throw new Error('That child is already a child of this tree'); } // return the new child node for convenience return child; }; /** * check to see if the provided tree is already a child of this * tree __or any of its sub trees__ */ Tree.prototype.isDescendant = function(child) { if (this.children.indexOf(child) !== -1) { // `child` is an immediate child of this tree return true; } else { for (var i = 0; i < this.children.length; i++) { if (this.children[i].isDescendant(child)) { // `child` is descendant of this tree return true; } } return false; } }; /** * remove an immediate child */ Tree.prototype.removeChild = function(child) { var index = this.children.indexOf(child); if (index !== -1) { // remove the child this.children.splice(index, 1); } else { throw new Error('That node is not an immediate child of this tree'); } }; var root1 = new Tree(1); var branch2 = root1.addChild(2); var branch3 = root1.addChild(3); var leaf4 = branch2.addChild(4); var leaf5 = branch2.addChild(5); var leaf6 = branch3.addChild(6); var leaf7 = branch3.addChild(7); console.log(root1.DFSelect(function (value, depth) { return value % 2; })) // [1, 5, 3, 7] console.log(root1.DFSelect(function (value, depth) { return depth === 1; })) // [2, 3]