193 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			193 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| id: 587d8259367417b2b2512c83
 | |
| title: 反转二叉树
 | |
| challengeType: 1
 | |
| forumTopicId: 301704
 | |
| dashedName: invert-a-binary-tree
 | |
| ---
 | |
| 
 | |
| # --description--
 | |
| 
 | |
| 这里我们将创建一个反转二叉树的函数。 给定二叉树,我们希望生成一个新树,它等效于该树的镜像。 与原始树的中序遍历相比,在倒转树上运行中序遍历将以相反的顺序探索节点。 在我们的二叉树上编写一个名为 `invert` 的方法。 调用此方法应该反转当前树结构。 理想情况下,我们希望在线性时间内就地执行此操作。 也就是说,我们只访问每个节点一次,我们在不使用任何额外内存的情况下修改现有的树结构。 祝你好运!
 | |
| 
 | |
| # --hints--
 | |
| 
 | |
| 存在 `BinarySearchTree` 数据结构。
 | |
| 
 | |
| ```js
 | |
| assert(
 | |
|   (function () {
 | |
|     var test = false;
 | |
|     if (typeof BinarySearchTree !== 'undefined') {
 | |
|       test = new BinarySearchTree();
 | |
|     }
 | |
|     return typeof test == 'object';
 | |
|   })()
 | |
| );
 | |
| ```
 | |
| 
 | |
| 二叉搜索树有一个名为 `invert` 的方法。
 | |
| 
 | |
| ```js
 | |
| assert(
 | |
|   (function () {
 | |
|     var test = false;
 | |
|     if (typeof BinarySearchTree !== 'undefined') {
 | |
|       test = new BinarySearchTree();
 | |
|     } else {
 | |
|       return false;
 | |
|     }
 | |
|     return typeof test.invert == 'function';
 | |
|   })()
 | |
| );
 | |
| ```
 | |
| 
 | |
| `invert` 方法正确地反转树结构。
 | |
| 
 | |
| ```js
 | |
| 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';
 | |
|   })()
 | |
| );
 | |
| ```
 | |
| 
 | |
| 反转空树应该返回 `null`。
 | |
| 
 | |
| ```js
 | |
| 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;
 | |
|   })()
 | |
| );
 | |
| ```
 | |
| 
 | |
| # --seed--
 | |
| 
 | |
| ## --after-user-code--
 | |
| 
 | |
| ```js
 | |
| BinarySearchTree.prototype = Object.assign(
 | |
|   BinarySearchTree.prototype,
 | |
|   {
 | |
|     add: function(value) {
 | |
|       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;
 | |
|         };
 | |
|       }
 | |
| 
 | |
|       var node = this.root;
 | |
|       if (node == null) {
 | |
|         this.root = new Node(value);
 | |
|         return;
 | |
|       } else {
 | |
|         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;
 | |
|       };
 | |
|     }
 | |
|   }
 | |
| );
 | |
| ```
 | |
| 
 | |
| ## --seed-contents--
 | |
| 
 | |
| ```js
 | |
| 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;
 | |
|   // Only change code below this line
 | |
| 
 | |
|   // Only change code above this line
 | |
| }
 | |
| ```
 | |
| 
 | |
| # --solutions--
 | |
| 
 | |
| ```js
 | |
| 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;
 | |
|   // Only 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;
 | |
|   }
 | |
|     // Only change code above this line
 | |
| }
 | |
| ```
 |