當(dāng)前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
JavaScript二叉搜索树
生活随笔
收集整理的這篇文章主要介紹了
JavaScript二叉搜索树
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
function BinarySearchTree(){var Node = function(key){this.key = key;this.left = null;this.right = null;};var root = null; //根元素//在樹中插入一個新的鍵this.insert = function(key){//創(chuàng)建用來表示新節(jié)點(diǎn)的Node實(shí)例var newNode = new Node(key);//插入的節(jié)點(diǎn)是樹的第一個節(jié)點(diǎn),就將根節(jié)點(diǎn)指向新節(jié)點(diǎn)if(root === null){root = newNode;}else{//節(jié)點(diǎn)加載非根節(jié)點(diǎn)的 其他位置insertNode(root,newNode);}};//找到新節(jié)點(diǎn)應(yīng)該插入的正確位置var insertNode = function(node, newNode){//如果新節(jié)點(diǎn)的鍵小于當(dāng)前節(jié)點(diǎn)的鍵if(newNode.key< node.key) {//檢查當(dāng)前節(jié)點(diǎn)的左側(cè)子節(jié)點(diǎn),如果它沒有左側(cè)子節(jié)點(diǎn),就在那里插入新的節(jié)點(diǎn)if (node.left === null) {node.left = newNode;} else {//如果有左側(cè)子節(jié)點(diǎn),遞歸調(diào)用insertNode方法繼續(xù)找到樹的下一層insertNode(node.left, newNode);}}else{//如果節(jié)點(diǎn)的鍵比當(dāng)前節(jié)點(diǎn)的鍵大,同時(shí)當(dāng)前節(jié)點(diǎn)沒有右側(cè)子節(jié)點(diǎn),就在那里插入新的節(jié)點(diǎn)if(node.right === null){node.right = newNode;}else{//如果又右側(cè)子節(jié)點(diǎn),遞歸調(diào)用insetNode方法insertNode(node.right,newNode);}}};//中序遍歷所有節(jié)點(diǎn)//接受一個回調(diào)函數(shù)作為參數(shù)this.inOrderTraverse = function(callback){inOrderTraverseNode(root,callback);};var inOrderTraverseNode = function(node,callback){//檢查以參數(shù)形式傳入的節(jié)點(diǎn)是否為nullif(node !== null){//遞歸調(diào)用相同的函數(shù)來訪問左側(cè)子節(jié)點(diǎn),對這個節(jié)點(diǎn)進(jìn)行一些操作(callback)inOrderTraverseNode(node.left,callback);callback(node.key);//訪問右側(cè)子節(jié)點(diǎn)inOrderTraverseNode(node.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);};var postOrderTraverseNode = function(node,callback){if(node!==null){postOrderTraverseNode(node.left,callback);postOrderTraverseNode(node.right,callback);callback(node.key);}};//尋找樹的最小鍵this.min = function(){//傳入樹的根節(jié)點(diǎn)return minNode(root);};var minNode = function(node){if(node){//遍歷樹的左邊,知道找到輸?shù)淖钕聦?#xff08;最左端)while(node &&node.left !== null){node = nnode.left;}return node.key;}return null;};//尋找樹的最大鍵this.max = function(){return maxNode(root);};var maxNode = function(node){if(node){while (node&& node.right !== null){node = node.right;}return node.key;}return null;};//聲明search方法this.search = function(key){return searchNode(root,key);};var searchNode = function(node,key){//驗(yàn)證作為參數(shù)傳入的node是否合法(不是null)如果是null,返回falseif(node===null){return false;}//要找的鍵比當(dāng)前節(jié)點(diǎn)小,繼續(xù)在左側(cè)子樹上搜索。要找的鍵比當(dāng)前的節(jié)點(diǎn)噠,從右側(cè)子節(jié)點(diǎn)開始搜索if(key<node.key){return searchNode(node.left,key);}else if(key>node.key){return searchNode(node.right,key);}else{//要找的鍵和當(dāng)前節(jié)點(diǎn)的鍵相等,返回truereturn true;}};this.remove = function(key){root = removeNode(root,key);};var removeNode = function(node,key){//檢測鍵是否存在于書中if(node===null){return null;}//在樹中找到要移除的節(jié)點(diǎn)//要找的鍵比當(dāng)前節(jié)點(diǎn)的值小,沿著樹的左邊找到下一個節(jié)點(diǎn)if(key<node.key){node.left = removeNode(node.left,key);return node;//要找的鍵比當(dāng)前節(jié)點(diǎn)的值大,沿著樹的右邊找到下一個節(jié)點(diǎn)}else if(key>node.key){node.right = removeNode(node.right,key);return node;}else{//找到了要找的鍵,處理3種不同情況//1.移除一個葉節(jié)點(diǎn)if(node.left ===null&&node.right ===null){node = null;return null;}//2.移除有一個左側(cè)或右側(cè)子節(jié)點(diǎn)的節(jié)點(diǎn)if(node.left === null){node = node.right;return node;} else if(node.right ===null){node = node.left;return node;}//3.移除有兩個子節(jié)點(diǎn)的節(jié)點(diǎn)var aux = findMinNode(node.right);node.key = aux.key;node.right = removeNode(node.right,aux.key);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);//創(chuàng)建一個回調(diào)函數(shù)function printNode(value){console.log(value);}//調(diào)用inOrderTraverse方法并將回調(diào)函數(shù)作為參數(shù)傳入//tree.inOrderTraverse(printNode);//調(diào)用preOrderTraverse//tree.preOrderTraverse(printNode);//調(diào)用postOrderTraverse//tree.postOrderTraverse(printNode);console.log(tree.search(1)?'found':'not found');console.log(tree.search(8)?'found':'not found');
總結(jié)
以上是生活随笔為你收集整理的JavaScript二叉搜索树的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript 字典类
- 下一篇: gradle idea java ssm