js樹形結構-----二叉樹增刪查
阿新 • • 發佈:2018-06-20
lba var IV cti post function htm fun node
function BinarySearchTree(){ var cnodes = function(key){ this.key = key; this.left = null; this.right = null; } var root = null; this.insert = function(key){ var nodes = new cnodes(key); if(root === null){ root = nodes; }else{ insertNode(root,nodes); } } function insertNode(rnode,newnode){ if(newnode.key < rnode.key){ if(rnode.left === null){ rnode.left = newnode; }else{ insertNode(rnode.left,newnode); } }else{ if(rnode.right === null){ rnode.right = newnode; }else{ insertNode(rnode.right , newnode ); } } } //中序遍歷 this.inOrderTraverse = function(callback){ inOrderTraverseNode(root, callback); }; function inOrderTraverseNode(cnode,callback){ if(cnode !== null){ inOrderTraverseNode(cnode.left,callback ); callback(cnode.key); inOrderTraverseNode(cnode.right,callback ); } } //先序遍歷 this.preOrderTraverse = function(callback){ preOrderTraverseNode(root, callback); }; var preOrderTraverseNode = function (node, callback) { if (node !== null) { callback(node.key); preOrderTraverseNode(node.left, callback); preOrderTraverseNode(node.right, callback); } }; //後序遍歷 this.postOrderTraverse = function(callback){ postOrderTraverseNode(root, callback); }; function postOrderTraverseNode(cnode, callback){ if(cnode !== null){ postOrderTraverseNode(cnode.left, callback); postOrderTraverseNode(cnode.right, callback); callback(cnode.key); } } //搜索最小值 this.min = function(){ return minNode(root); }; function minNode(cnode){ if(cnode){ while(cnode && cnode.left !== null){ cnode = cnode.left; } return cnode.key; } return null; } this.max = function(){ return maxNode(root); } function maxNode(cnode){ if(cnode){ while(cnode && cnode.right !== null){ cnode = cnode.right; } return cnode.key; } return null; } this.search = function(key){ return searchNode(root,key); }; function searchNode(cnode,key){ if(cnode === null){ return false; } if(key < cnode.key){ return searchNode(cnode.left,key); }else if(key > cnode.key){ return searchNode(cnode.right,key); }else{ return true; } } //刪除 this.remove = function(key){ root = removeNode(root,key); }; function removeNode(cnode,key){ if(cnode == null){ return null; } if(key < cnode.key){ cnode.left = removeNode(cnode.left , key); return cnode; }else if(key > cnode.key){ cnode.right = removeNode(cnode.right , key); return cnode; }else{ //等於的時候 //第一種情況,一個葉節點 if(cnode.left === null && cnode.right === null){ cnode = null; return cnode; } //第二種情況,一個子節點 if(cnode.left === null){ cnode = cnode.right; return cnode; }else if(cnode.right === null){ cnode = cnode.left; return cnode; } //第三種情況,兩個子節點 //1找到要刪除的節點 //2找到該節點,右側子樹中的最小節點,替換自己 //3刪掉右側子樹中的最小節點 var aux = findMinNode(cnode.right); cnode.key = aux.key; cnode.right = removeNode(cnode.right,aux.key); return cnode; } } var findMinNode = function(node){ //右側子樹中最小節點的鍵去更新這個節點的值 while (node && node.left !== null) { node = node.left; } return node; }; } var tree = new BinarySearchTree(); tree.insert(11); tree.insert(7); tree.insert(15); tree.insert(5); tree.insert(3); tree.insert(9); tree.insert(8); tree.insert(10); tree.insert(13); tree.insert(12); tree.insert(14); tree.insert(20); tree.insert(18); tree.insert(25); tree.insert(6); tree.inOrderTraverse(function(key){ console.log(key); }); tree.remove(15); console.log("-----------"); tree.inOrderTraverse(function(key){ console.log(key); });
js樹形結構-----二叉樹增刪查