JS-常用的数据结构之树、二叉树、平衡二叉树
二叉树的实现代码
1 // 二叉树构造 2 function BinaryTree(){ 3 var Node=function(key){ //节点函数 4 this.key=key; 5 this.left=null; 6 this.right=null; 7 } 8 9 var root = null; 10 this.insert = function(key){ 11 var newNode = new Node(key); 12 if(root == null){ 13 root = newNode; 14 }else{ 15 insertNode(root, newNode); 16 } 17 } 18 19 var insertNode = function(node, newNode){ 20 if(node.key > newNode.key){ 21 if(node.left == null){ 22 node.left = newNode; 23 }else{ 24 insertNode(node.left, newNode); 25 } 26 }else{ 27 if(node.right == null){ 28 node.right = newNode; 29 }else{ 30 insertNode(node.right, newNode); 31 } 32 } 33 } 34 35 var inOrderTraverseNode = function(node, callback){ 36 if(node != null){ 37 inOrderTraverseNode(node.left, callback); 38 callback(node.key); 39 inOrderTraverseNode(node.right, callback); 40 } 41 } 42 // 中序遍历 43 this.inOrderTraverse = function(callback){ 44 inOrderTraverseNode(root, callback); 45 } 46 47 var proOrderTraverseNode=function(node,callback){ 48 if(node!=null){ 49 callback(node.key) 50 proOrderTraverseNode(node.left,callback) 51 proOrderTraverseNode(node.right,callback) 52 } 53 } 54 //前序遍历 复制 效率高得多 55 this.proOrderTraverse=function(callback){ 56 proOrderTraverseNode(root,callback); 57 } 58 59 var postOrderTraverseNode=function(node,callback){ 60 if(node!=null){ 61 postOrderTraverseNode(node.left,callback) 62 postOrderTraverseNode(node.right,callback) 63 callback(node.key) 64 } 65 } 66 //后续遍历 文件系统遍历 67 this.postOrderTraverse=function(callback){ 68 postOrderTraverseNode(root,callback); 69 } 70 71 // 查找 72 // 查找最大值 73 var maxNode=function(node){ 74 if(node){ 75 while(node&&node.right!=null){ 76 node=node.right; 77 } 78 return node.key; 79 } 80 } 81 this.max=function(){ 82 return maxNode(root); 83 } 84 85 // 查找最小值 86 var minNode = function(node){ 87 if (node){ 88 while(node && node.left != null){ 89 node = node.left; 90 } 91 return node.key; 92 } 93 } 94 this.min=function(){ 95 return minNode(root); 96 } 97 98 // 查找指定值 99 var searchNode=function(node,key){ 100 if (node == null){ 101 return false; 102 } 103 104 if(node.key > key){ 105 searchNode(node.left, key); 106 }else if (node.key < key){ 107 searchNode(node.right, key); 108 }else{ 109 return true; 110 } 111 } 112 this.search=function(key){ 113 return searchNode(root,key) 114 } 115 116 /** 117 * 二叉树的删除 118 * 二叉树删除分三种情况 119 * 删除左叶子节点 120 * 删除右叶子节点 121 * 以及拥有左右两个节点的主节点删除 122 * 拥有左右两个节点的主节点删除要考虑到数据的可排序行需要将删掉的节点重新赋值 123 */ 124 var findMinNode=function(node){ //如果存在左右两个节点的话查找右节点的最小节点 125 if(node){ 126 while(node&&node.left!=null){ 127 node=node.left 128 } 129 return node; 130 } 131 return null 132 } 133 134 var removeNode=function(node,key){ 135 if (node == null){ 136 return null; 137 } 138 139 if(node.key > key){ // 递归查找左叶子节点,直接等于返回的null值 140 node.left = removeNode(node.left, key); 141 return node; 142 }else if(node.key < key){ 143 node.right = removeNode(node.right, key); 144 return node; 145 }else{ 146 if(node.left==null&&node.right==null){// 当只有一个节点,而且被选中 147 node=null; 148 return node; 149 } 150 if(node.left==null){ //左节点为空 151 node=node.right; 152 return node; 153 }else if(node.right==null){//右节点为空 154 node=node.left; 155 return node; 156 } 157 158 // ????? 159 var aux=findMinNode(node.right);//查找到右节点最小节点赋值 160 node.key=aux.key; 161 node.right=removeNode(node.right,aux.key); 162 return node; 163 } 164 } 165 this.remove=function(key){ 166 return removeNode(root,key) 167 } 168 } 169 170 // test 171 var nodes=[8,3,10,2,9,14,4,7,13]; 172 var binaryTree=new BinaryTree(); 173 nodes.forEach(function(key){ 174 binaryTree.insert(key); 175 }) 176 var callback=function(key){ 177 document.write(key); 178 } 179 binaryTree.inOrderTraverse(callback); 180 181 document.write("+++++++++" + binaryTree.max());