Overview
Based on Traverse a Tree - Introduction. How to traverse a binary tree recursively- Pre-Order,
- In-Order,
- Post-Order
- Breadth-First
using mocha+chai test framework.
Github Repo: TreeTraversalJS
Source Code
let Queue = require('./Queue'); let print = console.log; function TreeTraversal() { this.PathResult = []; this.init = function(first) { if(first) this.PathResult = []; } this.end = function(first) { if(first) print(`Path:${JSON.stringify(this.PathResult)}`); } this.processNode = function(node) { this.PathResult.push(node.value); } this.recursively_PreOrderTraversal = function (t, first) { this.init(first); this.processNode(t); if(t.left) this.recursively_PreOrderTraversal(t.left); if(t.right) this.recursively_PreOrderTraversal(t.right); this.end(first); } this.recursively_InOrderTraversal = function (t, first) { this.init(first); if(t.left) this.recursively_InOrderTraversal(t.left); this.processNode(t); if(t.right) this.recursively_InOrderTraversal(t.right); this.end(first); } this.recursively_PostOrderTraversal = function(t, first) { this.init(first); if(t.left) this.recursively_PostOrderTraversal(t.left); if(t.right) this.recursively_PostOrderTraversal(t.right); this.processNode(t); this.end(first); } this.breadthFirst = function(t) { this.init(true); let q = new Queue(); q.enqueue(t); while(!q.isEmpty()) { let node = q.dequeue(); this.processNode(node); if(node.left) q.enqueue(node.left); if(node.right) q.enqueue(node.right); } this.end(true); } } module.exports = TreeTraversal;
Unit tests
let assert = require('chai').assert; let expect = require('chai').expect; let TreeTraversal = require('../src/TreeTraversal'); /* F / \ B G / \ \ A D I / \ / C E H */ let root = { value : "F", right : { value: "G", right:{ value:"I", left : { value:"H" } } }, left:{ value:"B", left : { value:"A" }, right :{ value:"D", left :{ value:"C" }, right : { value:"E" } } } }; let print = console.log; function arrayEqual(a0, a1) { return a0.join() == a1.join(); } describe('TreeTraversal', () => { let subject; before(() => { subject = new TreeTraversal(); }); describe('recursively_PreOrderTraversal', () => { let expected = ["F","B","A","D","C","E","G","I","H"]; it(`should return ${expected}`, () => { subject.recursively_PreOrderTraversal(root, true); expect(arrayEqual(expected, subject.PathResult)).to.be.true; }); }); describe('recursively_InOrderTraversal', () => { let expected = ["A","B","C","D","E","F","G","H","I"]; it(`should return ${expected}`, () => { subject.recursively_InOrderTraversal(root, true); expect(arrayEqual(expected, subject.PathResult)).to.be.true; }); }); describe('recursively_PostOrderTraversal', () => { let expected = ["A","C","E","D","B","H","I","G","F"]; it(`should return ${expected}`, () => { subject.recursively_PostOrderTraversal(root, true); expect(arrayEqual(expected, subject.PathResult)).to.be.true; }); }); describe('breadthFirst', () => { let expected = ["F","B","G","A","D","I","C","E","H"]; it(`should return ${expected}`, () => { subject.breadthFirst(root, true); expect(arrayEqual(expected, subject.PathResult)).to.be.true; }); }); });
This comment has been removed by a blog administrator.
ReplyDelete