浅谈排序二叉树
前言:
大学时代,已过去一年多了,数据结构是我们最害怕的课,也是我最喜欢的课,曾经有个plan毕业了研究算法,但是世事难料,最后自己的人生轨迹偏向了游戏行业。
最近不知道那根筋不对,就是想回首,再看看二叉树,以下是我的一些见解,欢迎大家指正!
我们工作中,使用最多的就是排序二叉树(不一定是平衡二叉树哦)
以下代码,包含了,二叉树的创建,前序遍历,中序遍历,后续遍历,查找最大值,查找最小值,查找特定值,删除特定值(子节点,只有右孩子的节点,只有左孩子的节点,拥有左右子树的节点)
1 var binaryTree = function(){ 2 3 var createNode = function(key){ 4 this.key = key; 5 this.left = null; 6 this.right = null; 7 } 8 9 10 var insertNode = function(node, newNode){ 11 if(newNode.key < node.key){ 12 if(node.left === null){ 13 node.left = newNode; 14 }else{ 15 insertNode(node.left, newNode); 16 } 17 }else{ 18 if(node.right === null){ 19 node.right = newNode; 20 }else{ 21 insertNode(node.right, newNode); 22 } 23 } 24 } 25 26 27 var root = null; 28 this.createTree = function(key){ 29 var newNode = new createNode(key); 30 if(root === null){ 31 root = newNode; 32 }else{ 33 insertNode(root, newNode); 34 } 35 } 36 37 38 39 40 // 中序遍历: 输出升序的数组 41 var inorderTraversalNode = function(node){ 42 if(node !== null){ 43 inorderTraversalNode(node.left); 44 console.log(node.key); 45 inorderTraversalNode(node.right); 46 } 47 } 48 49 50 // 前序遍历:高效复制一个二叉树(On) 51 var preTraversalNode = function(node){ 52 if(node !== null){ 53 console.log(node.key); 54 preTraversalNode(node.left); 55 preTraversalNode(node.right); 56 } 57 } 58 59 60 // 后序遍历:文件系统的遍历 61 var postTraversalNode = function(node){ 62 if(node !== null){ 63 preTraversalNode(node.left); 64 preTraversalNode(node.right); 65 console.log(node.key); 66 } 67 } 68 69 70 // type 1:前序 71 // type 2:中序 72 // type 3:后序 73 this.traversal = function(type){ 74 switch(type){ 75 case 1: 76 preTraversalNode(root); 77 break; 78 case 2: 79 inorderTraversalNode(root); 80 break; 81 case 3: 82 postTraversalNode(root) 83 break; 84 } 85 } 86 87 88 var minNode = function(node){ 89 if(node){ 90 if(node.left){ 91 return minNode(node.left); 92 }else{ 93 return node.key; 94 } 95 } 96 return null; 97 } 98 this.min = function(){ 99 return minNode(root); 100 } 101 102 103 104 var maxNode = function(node){ 105 if(node){ 106 if(node.right){ 107 return maxNode(node.right) 108 }else{ 109 return node.key; 110 } 111 return null; 112 } 113 } 114 this.max = function(){ 115 return maxNode(root); 116 } 117 118 119 var searchNode = function(node, key){ 120 if(node){ 121 if(key < node.key){ 122 return searchNode(node.left, key); 123 }else if(key > node.key){ 124 return searchNode(node.right, key); 125 }else{ 126 return true; 127 } 128 } 129 return false; 130 } 131 this.search = function(key){ 132 return searchNode(root, key); 133 } 134 135 var findMinNode = function(node){ 136 if(node){ 137 if(node.left){ 138 return findMinNode(node.left); 139 }else{ 140 return node; 141 } 142 } 143 return null; 144 } 145 var removeNode = function(node, key){ 146 if(node){ 147 if(key < node.key){ 148 node.left = removeNode(node.left, key); 149 return node; 150 }else if(key > node.key){ 151 node.right = removeNode(node.right, key); 152 return node; 153 }else{ 154 if(node.left === null && node.right === null){ 155 node = null; 156 return node; 157 }else if(node.left === null){ 158 node = node.right; 159 return node; 160 }else if(node.right === null){ 161 node = node.left; 162 return node; 163 }else{ 164 var aux = findMinNode(node.right); 165 node.key = aux.key; 166 node.right = removeNode(node.right, aux.key); 167 return node; 168 } 169 } 170 } 171 } 172 this.remove = function(key){ 173 root = removeNode(root, key) 174 } 175 } 176 177 178 var tree = new binaryTree(); 179 var arr = [4, 2, 12, 10, -7, 21, 3, 99, 76]; 180 for(var i = 0; i < arr.length; i ++){ 181 tree.createTree(arr[i]); 182 } 183 184 tree.traversal(2); 185 console.log('The tree minNode key is ' + tree.min()); 186 console.log('The tree maxNode key is ' + tree.max()); 187 console.log(tree.search(12) ? 'The key is 12 is found' : 'The key is 12 is not found'); 188 console.log(tree.search(11) ? 'The key is 11 is found' : 'The key is 11 is not found');