摘要:一數(shù)據(jù)模型二遞歸實(shí)現(xiàn)遞歸實(shí)現(xiàn)三非遞歸廣度優(yōu)先實(shí)現(xiàn)先將第一層節(jié)點(diǎn)放入棧如果該節(jié)點(diǎn)有子節(jié)點(diǎn),繼續(xù)添加進(jìn)入棧底非遞歸廣度優(yōu)先實(shí)現(xiàn)四非遞歸深度優(yōu)先實(shí)現(xiàn)先將第一層節(jié)點(diǎn)放入棧如果該節(jié)點(diǎn)有子節(jié)點(diǎn),繼續(xù)添加進(jìn)入棧頂非遞歸深度優(yōu)先實(shí)現(xiàn)
文章來(lái)源:http://www.html-js.com/articl...
簡(jiǎn)單的遍歷一個(gè)樹形結(jié)構(gòu)數(shù)據(jù)的幾種方法、非遞歸方法效率最好。
一:數(shù)據(jù)模型:(function (window, undefined) { var treeNodes = [ { id: 1, name: "1", children: [ { id: 11, name: "11", children: [ { id: 111, name: "111", children:[] }, { id: 112, name: "112" } ] }, { id: 12, name: "12", children: [] } ], users: [] }, { id: 2, name: "2", children: [ { id: 22, name: "22", children: [] } ] } ];二:遞歸實(shí)現(xiàn)
var parseTreeJson = function(treeNodes){ if (!treeNodes || !treeNodes.length) return; for (var i = 0, len = treeNodes.length; i < len; i++) { var childs = treeNodes[i].children; console.log(treeNodes[i].id); if(childs && childs.length > 0){ parseTreeJson(childs); } } }; console.log("------------- 遞歸實(shí)現(xiàn) ------------------"); parseTreeJson(treeNodes);三:非遞歸廣度優(yōu)先實(shí)現(xiàn)
var iterator1 = function (treeNodes) { if (!treeNodes || !treeNodes.length) return; var stack = []; //先將第一層節(jié)點(diǎn)放入棧 for (var i = 0, len = treeNodes.length; i < len; i++) { stack.push(treeNodes[i]); } var item; while (stack.length) { item = stack.shift(); console.log(item.id); //如果該節(jié)點(diǎn)有子節(jié)點(diǎn),繼續(xù)添加進(jìn)入棧底 if (item.children && item.children.length) { //len = item.children.length; // for (i = 0; i < len; i++) { // stack.push(item.children[i]); // } stack = stack.concat(item.children); } } }; console.log("------------- 非遞歸廣度優(yōu)先實(shí)現(xiàn) ------------------"); iterator1(treeNodes);四:非遞歸深度優(yōu)先實(shí)現(xiàn)
var iterator2 = function (treeNodes) { if (!treeNodes || !treeNodes.length) return; var stack = []; //先將第一層節(jié)點(diǎn)放入棧 for (var i = 0, len = treeNodes.length; i < len; i++) { stack.push(treeNodes[i]); } var item; while (stack.length) { item = stack.shift(); console.log(item.id); //如果該節(jié)點(diǎn)有子節(jié)點(diǎn),繼續(xù)添加進(jìn)入棧頂 if (item.children && item.children.length) { // len = item.children.length; // for (; len; len--) { // stack.unshift(item.children[len - 1]); // } stack = item.children.concat(stack); } } }; console.log("------------- 非遞歸深度優(yōu)先實(shí)現(xiàn) ------------------"); iterator2(treeNodes); })(window);
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/82360.html
摘要:算法之深度優(yōu)先遍歷和廣度優(yōu)先遍歷背景在開發(fā)頁(yè)面的時(shí)候,我們有時(shí)候會(huì)遇到這種需求在頁(yè)面某個(gè)節(jié)點(diǎn)中遍歷,找到目標(biāo)節(jié)點(diǎn),我們正常做法是利用選擇器,或者,但在本文,我們從算法的角度去查找節(jié)點(diǎn),同時(shí)理解一下深度優(yōu)先遍歷和廣度優(yōu)先遍歷的原理。 JS算法之深度優(yōu)先遍歷(DFS)和廣度優(yōu)先遍歷(BFS) 背景 在開發(fā)頁(yè)面的時(shí)候,我們有時(shí)候會(huì)遇到這種需求:在頁(yè)面某個(gè)dom節(jié)點(diǎn)中遍歷,找到目標(biāo)dom節(jié)點(diǎn),...
摘要:樹中結(jié)點(diǎn)的最大層次稱為樹的深度或高度。二叉樹有深度遍歷和廣度遍歷,深度遍歷有前序中序和后序三種遍歷方法。二叉樹的前序遍歷可以用來(lái)顯示目錄結(jié)構(gòu)等中序遍歷可以實(shí)現(xiàn)表達(dá)式樹,在編譯器底層很有用后序遍歷可以用來(lái)實(shí)現(xiàn)計(jì)算目錄內(nèi)的文件及其信息等。 樹的簡(jiǎn)介 棧、隊(duì)列、鏈表等數(shù)據(jù)結(jié)構(gòu),都是順序數(shù)據(jù)結(jié)構(gòu)。而樹是非順序數(shù)據(jù)結(jié)構(gòu)。樹型結(jié)構(gòu)是一類非常重要的非線性結(jié)構(gòu)。直觀地,樹型結(jié)構(gòu)是以分支關(guān)系定義的層次結(jié)...
摘要:先畫個(gè)樹,然后解釋何為深度,何為廣度第一層子集第二層子集第二層子集第三層,子集第三層第四層圖就不畫太復(fù)雜了,最高四層的結(jié)構(gòu),如果換成的形式的話可以理解成第一層第二層 先畫個(gè)樹,然后解釋 何為深度, 何為廣度 第一層 子集 | ...
摘要:圖的實(shí)現(xiàn)如下采用鄰接表結(jié)構(gòu)實(shí)現(xiàn)。由于本次示例的是無(wú)向圖,因此每個(gè)頂點(diǎn)都互相增加為鄰接點(diǎn)。然而由于本次示例的圖為無(wú)向圖,會(huì)出現(xiàn)重復(fù)遍歷的情況,例如頂點(diǎn)的鄰接點(diǎn)有,的鄰接點(diǎn)有。 圖的定義 圖就是由若干個(gè)頂點(diǎn)和邊連接起來(lái)的一種結(jié)構(gòu)。很多東西都可以用圖來(lái)說(shuō)明,例如人際關(guān)系,或者地圖。 其中圖還分為有向圖和無(wú)向圖。如下就是有向圖 圖的數(shù)據(jù)結(jié)構(gòu) 對(duì)于圖這種關(guān)系,可以通過(guò)兩種方式來(lái)存儲(chǔ)。 領(lǐng)接表 將...
閱讀 3530·2019-08-30 15:55
閱讀 2112·2019-08-30 15:44
閱讀 1567·2019-08-30 12:47
閱讀 800·2019-08-30 11:05
閱讀 1676·2019-08-30 10:54
閱讀 708·2019-08-29 16:07
閱讀 3639·2019-08-29 14:17
閱讀 2294·2019-08-23 18:31