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