摘要:先序遍歷的一種應(yīng)用是打印一個結(jié)構(gòu)化的文檔。方法的實現(xiàn)如下中序遍歷中序遍歷是一種以上行順序訪問所有節(jié)點的遍歷方式,也就是以從最小到最大的順序訪問所有節(jié)點。中序遍歷的一種應(yīng)用就是對樹進(jìn)行排序操作。
1、二叉搜索樹(兩個條件):
(1)二叉樹中的節(jié)點最多只有兩個子節(jié)點:一個是左側(cè)節(jié)點,另一個是右側(cè)子節(jié)點;
(2)只允許在左側(cè)節(jié)點存儲(比父節(jié)點)小的值,在右側(cè)節(jié)點存儲(比父節(jié)點)大(或者等于)的值;
主要包括有插入(insert)、搜索(search)、移除(removce)、遍歷(traverse)等功能
var Tree = function() { var Node = function(value) { this.value = value; this.left = null; //左節(jié)點 this.right = null; //右節(jié)點 } var root = null; //根節(jié)點 /* 插入節(jié)點: 1、樹為空 2、樹不為空 -> 比較(小于 -> 往左走;大于 -> 往右走) */ this.insert = function(value) {}; //搜索節(jié)點(搜索一個特定的值) this.search = function(value) {}; //尋找樹的最小鍵的方法 this.min = function() {}; //尋找樹的最大鍵的方法 this.max = function() {}; /* 移除節(jié)點: 1、最簡單的情況:移除葉節(jié)點 2、移除只有一個子節(jié)點的節(jié)點 3、移除有兩個子節(jié)點的節(jié)點(替換為右側(cè)子樹的最小節(jié)點) */ this.remove =function(value) { }; //遍歷節(jié)點 this.traverse = function(callback) {}; //顯示樹 this.getRoot = function() {}; }3、整體詳細(xì)代碼部分
var Tree = function() { var Node = function(value) { this.value = value; this.left = null; this.right = null; } var root = null; //根節(jié)點 /* 插入節(jié)點: 1、樹為空 2、樹不為空 -> 比較(小于 -> 往左走;大于 -> 往右走) */ this.insert = function(value) { var newNode = new Node(value); if(root == null) { //空樹 root = newNode; }else{//樹非空 insertNode(root, newNode); } }; var insertNode = function(node, newNode) { if(newNode.value > node.value) { //往右走 if(node.right == null) { node.right = newNode; }else{ insertNode(node.right, newNode); } }else if(newNode.value < node.value) { //往左走 if(node.left == null) { node.left = newNode; }else{ insertNode(node.left, newNode); } } }; //搜索節(jié)點(搜索一個特定的值) this.search = function(value) { return searchNode(root, value); }; var searchNode = function(node, value) { if(node === null) { return false; } if(value < node.value) { return searchNode(node.left, value); }else if(value > node.value) { return searchNode(node.right, value); }else{ return true; } }; //尋找樹的最小鍵的方法 this.min = function() { return minNode(root); }; var minNode = function(node) { if(node) { while(node && node.left !== null) { node = node.left; } return node.value; } return null; }; //尋找樹的最大鍵的方法 this.max = function() { return maxNode(root); }; var maxNode = function(node) { if(node) { while(node && node.right !== null) { node = node.right; } return node.value; } return null; }; /* 移除節(jié)點: 1、最簡單的情況:移除葉節(jié)點 2、移除只有一個子節(jié)點的節(jié)點 3、移除有兩個子節(jié)點的節(jié)點(替換為右側(cè)子樹的最小節(jié)點) */ this.remove =function(value) { root = removeNode(root, value); }; var removeNode = function(node,value) { if( node == null) return null; if(node.value < value) { //繼續(xù)向右查找 node.right = removeNode(node.right , value); return node; }else if(node.value > value) { //向左查找 node.left = removeNode(node.left, value); return node; }else{ //value == node.value //執(zhí)行刪除過程 //葉節(jié)點條件 if(node.left == null && node.right == null) { node = null; return node; } //只有一個子節(jié)點條件 if(node.left == null && node.right) { node = node.right; return node; }else if(node.right == null && node.left){ node = node.left; return node; } //有兩個子節(jié)點(替換為右側(cè)子樹的最小節(jié)點) var aux = findMinNode(node.right); //aux是查找到的最小的子節(jié)點 node.value = aux.value; node.right = removeNode(node.right, aux.value); return node; } }; var findMinNode = function(node) { if(node == null) return null; while(node && node.left) { node = node.left; } return node; }; //遍歷節(jié)點 this.traverse = function(callback) { traverse(root, callback); }; var traverse = function(node, callback) { if(node == null) return; //(后續(xù)遍歷)左右中;(中序遍歷)左中右;(前序遍歷)中左右 traverse(node.left, callback); traverse(node.right, callback); callback(node.value); }; //顯示樹 this.getRoot = function() { return root; }; }4、代碼功能驗證測試
var t = new Tree; var print = function(value) { console.log("value -",value) }; t.insert(11); t.insert(8); t.insert(4); t.insert(9); t.insert(3); t.insert(5); t.insert(9); t.insert(12); t.search(9); //true t.remove(8); t.min(); //3 t.max(); //12 t.traverse(print);5、遍歷方式 先序遍歷
先序遍歷是以優(yōu)先于后代節(jié)點的順序訪問每個節(jié)點的。先序遍歷的一種應(yīng)用是打印一個結(jié)構(gòu)化的文檔。
11 7 5 3 6 9 8 10 15 13 12 14 20 18 25
this.preOrderTraverse = function(callback){ preOrderTraverseNode(root, callback); }; preOrderTraverseNode方法的實現(xiàn)如下: var preOrderTraverseNode = function (node, callback) { if (node !== null) { callback(node.key); //{1} preOrderTraverseNode(node.left, callback); //{2} preOrderTraverseNode(node.right, callback); //{3} } };中序遍歷
中序遍歷是一種以上行順序訪問BST所有節(jié)點的遍歷方式,也就是以從最小到最大的順序訪問所有節(jié)點。中序遍歷的一種應(yīng)用就是對樹進(jìn)行排序操作。
3 5 6 7 8 9 10 11 12 13 14 15 18 20 25
this.inOrderTraverse = function(callback){ inOrderTraverseNode(root, callback); //{1} }; var inOrderTraverseNode = function (node, callback) { if (node !== null) { //{2} inOrderTraverseNode(node.left, callback); //{3} callback(node.key); //{4} inOrderTraverseNode(node.right, callback); //{5} } };后序遍歷
后序遍歷則是先訪問節(jié)點的后代節(jié)點,再訪問節(jié)點本身。后序遍歷的一種應(yīng)用是計算一個目錄和它的子目錄中所有文件所占空間的大小。
3 6 5 8 10 9 7 12 14 13 18 25 20 15 11
this.postOrderTraverse = function(callback){ postOrderTraverseNode(root, callback); }; postOrderTraverseNode方法的實現(xiàn)如下: var postOrderTraverseNode = function (node, callback) { if (node !== null) { postOrderTraverseNode(node.left, callback); //{1} postOrderTraverseNode(node.right, callback); //{2} callback(node.key); //{3} } };
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/106474.html
摘要:平衡二叉樹代碼實現(xiàn)根節(jié)點插入節(jié)點樹為空樹不為空比較小于往左走大于往右走空樹樹非空自平衡樹插入新節(jié)點向左走向左子樹拆入新節(jié)點,且節(jié)點的值小于其左子節(jié)點時,應(yīng)該進(jìn)行旋轉(zhuǎn)。 平衡二叉樹JS代碼實現(xiàn) var Tree = function() { var Node = function(value) { this.value = value; this....
摘要:貢獻(xiàn)者飛龍版本最近總是有人問我,把這些資料看完一遍要用多長時間,如果你一本書一本書看的話,的確要用很長時間。為了方便大家,我就把每本書的章節(jié)拆開,再按照知識點合并,手動整理了這個知識樹。 Special Sponsors showImg(https://segmentfault.com/img/remote/1460000018907426?w=1760&h=200); 貢獻(xiàn)者:飛龍版...
摘要:最近在全力整理高性能的文檔,并重新學(xué)習(xí)一遍,放在這里方便大家查看并找到自己需要的知識點。 最近在全力整理《高性能JavaScript》的文檔,并重新學(xué)習(xí)一遍,放在這里方便大家查看并找到自己需要的知識點。 前端開發(fā)文檔 高性能JavaScript 第1章:加載和執(zhí)行 腳本位置 阻止腳本 無阻塞的腳本 延遲的腳本 動態(tài)腳本元素 XMLHTTPRequest腳本注入 推薦的無阻塞模式...
摘要:一旦我們滿足了基本條件值為,我們將不再調(diào)用遞歸函數(shù),只是有效地執(zhí)行了。遞歸深諳函數(shù)式編程之精髓,最被廣泛引證的原因是,在調(diào)用棧中,遞歸把大部分顯式狀態(tài)跟蹤換為了隱式狀態(tài)。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個流淌著滬江血液的純粹工程:認(rèn)真,是 HTML 最堅實的梁柱;...
摘要:哪吒社區(qū)技能樹打卡打卡貼函數(shù)式接口簡介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號作者架構(gòu)師奮斗者掃描主頁左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進(jìn)步歡迎點贊收藏留言前情提要無意間聽到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨立帶隊的人太少,簡而言之,不缺干 ? 哪吒社區(qū)Java技能樹打卡?【打卡貼 day2...
閱讀 2999·2023-04-25 21:23
閱讀 3042·2021-09-22 15:24
閱讀 870·2019-08-30 12:55
閱讀 2104·2019-08-29 18:42
閱讀 2615·2019-08-29 16:27
閱讀 955·2019-08-26 17:40
閱讀 2189·2019-08-26 13:29
閱讀 2614·2019-08-26 11:45