2018-10-04 14:37:37 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								---
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								id: 587d8259367417b2b2512c83
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								title: Invert a Binary Tree
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								challengeType: 1
							 
						 
					
						
							
								
									
										
										
										
											2019-08-05 09:17:33 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								forumTopicId: 301704
							 
						 
					
						
							
								
									
										
										
										
											2018-10-04 14:37:37 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								---
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								## Description
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< section  id = 'description' >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Here will we create a function to invert a binary tree. Given a binary tree, we want to produce a new tree that is equivalently the mirror image of this tree. Running an inorder traversal on an inverted tree will explore the nodes in reverse order when compared to the inorder traversal of the original tree. Write a method to do this called < code > invert< / code >  on our binary tree. Calling this method should invert the current tree structure. Ideally, we would like to do this in-place in linear time. That is, we only visit each node once and we modify the existing tree structure as we go, without using any additional memory. Good luck!
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< / section >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								## Instructions
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< section  id = 'instructions' >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< / section >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								## Tests
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< section  id = 'tests' >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```yml
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								tests:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  -  text: The < code > BinarySearchTree</ code >  data structure exists.
							 
						 
					
						
							
								
									
										
										
										
											2019-07-24 23:56:32 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    testString: assert((function() { var test = false; if (typeof BinarySearchTree !== 'undefined') { test = new BinarySearchTree() }; return (typeof test == 'object')})());
							 
						 
					
						
							
								
									
										
										
										
											2018-10-04 14:37:37 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								  -  text: The binary search tree has a method called < code > invert</ code > .
							 
						 
					
						
							
								
									
										
										
										
											2019-07-24 23:56:32 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    testString: assert((function() { var test = false; if (typeof BinarySearchTree !== 'undefined') { test = new BinarySearchTree() } else { return false; }; return (typeof test.invert == 'function')})());
							 
						 
					
						
							
								
									
										
										
										
											2018-10-04 14:37:37 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								  -  text: The < code > invert</ code >  method correctly inverts the tree structure.
							 
						 
					
						
							
								
									
										
										
										
											2019-07-24 23:56:32 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    testString: assert((function() { var test = false; if (typeof BinarySearchTree !== 'undefined') { test = new BinarySearchTree() } else { return false; }; if (typeof test.invert !== 'function') { return false; }; test.add(4); test.add(1); test.add(7); test.add(87); test.add(34); test.add(45); test.add(73); test.add(8); test.invert(); return test.inorder().join('') == '877345348741'; })());
							 
						 
					
						
							
								
									
										
										
										
											2018-10-04 14:37:37 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								  -  text: Inverting an empty tree returns < code > null</ code > .
							 
						 
					
						
							
								
									
										
										
										
											2019-07-24 23:56:32 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    testString: assert((function() { var test = false; if (typeof BinarySearchTree !== 'undefined') { test = new BinarySearchTree() } else { return false; }; if (typeof test.invert !== 'function') { return false; }; return (test.invert() == null); })());
							 
						 
					
						
							
								
									
										
										
										
											2018-10-04 14:37:37 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< / section >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								## Challenge Seed
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< section  id = 'challengeSeed' >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< div  id = 'js-seed' >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```js
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								var displayTree = (tree) => console.log(JSON.stringify(tree, null, 2));
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								function Node(value) {
							 
						 
					
						
							
								
									
										
										
										
											2019-06-20 13:28:37 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  this.value = value;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  this.left = null;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  this.right = null;
							 
						 
					
						
							
								
									
										
										
										
											2018-10-04 14:37:37 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								function BinarySearchTree() {
							 
						 
					
						
							
								
									
										
										
										
											2019-06-20 13:28:37 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  this.root = null;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  // change code below this line
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  // change code above this line
							 
						 
					
						
							
								
									
										
										
										
											2018-10-04 14:37:37 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< / div >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								### After Test
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< div  id = 'js-teardown' >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```js
							 
						 
					
						
							
								
									
										
										
										
											2018-10-20 21:02:47 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								BinarySearchTree.prototype = {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    add: function(value) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        var node = this.root;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if (node == null) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          this.root = new Node(value);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          return;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } else {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            function searchTree(node) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if (value <  node.value )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if (node.left == null) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        node.left = new Node(value);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        return;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } else if (node.left != null) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        return searchTree(node.left)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } else if (value > node.value) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if (node.right == null) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        node.right = new Node(value);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        return;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } else if (node.right != null) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        return searchTree(node.right);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } else {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    return null;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return searchTree(node);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    },
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    inorder: function() {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if (this.root == null) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          return null;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } else {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          var result = new Array();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          function traverseInOrder(node) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								              if (node.left != null) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                  traverseInOrder(node.left);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								              };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								              result.push(node.value);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								              if (node.right != null) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                  traverseInOrder(node.right);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								              };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          traverseInOrder(this.root);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          return result;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								};
							 
						 
					
						
							
								
									
										
										
										
											2018-10-04 14:37:37 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< / div >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< / section >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								## Solution
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< section  id = 'solution' >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```js
							 
						 
					
						
							
								
									
										
										
										
											2019-06-20 13:28:37 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								var displayTree = (tree) => console.log(JSON.stringify(tree, null, 2));
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								function Node(value) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  this.value = value;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  this.left = null;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  this.right = null;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								function BinarySearchTree() {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  this.root = null;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  // change code below this line
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  this.invert = function(node = this.root) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if (node) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      const temp = node.left;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      node.left = node.right;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      node.right = temp;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      this.invert(node.left);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      this.invert(node.right);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return node;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // change code above this line
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-04 14:37:37 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2019-06-20 13:28:37 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-04 14:37:37 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								< / section >