樹遍歷演算法之深度優先和廣度優先

2021-10-21 01:49:31 字數 1587 閱讀 7202

前兩天看到乙個阿里面試題 關於dfs 和bfs的演算法題,在網上找了很多,沒確切答案。今天我們一起來做下這個題目

題目:實現乙個深度優先搜尋演算法(要求:不能用遞迴)

var tree = ]},

,,

],},,,

,,

],},

],};var node = dfs/bfs(tree, '西寧市');

console.log(node); // 輸出:

複製**

題目要求非遞迴方式拿到搜尋內容,那麼我們不用遞迴怎麼去實現查詢呢?

如果我們用遞迴方式非常簡單:貼**

// 遞迴演算法

function dfs(tree, name)

if(!tree.name && !tree.children)

for(let i = 0; i < tree.children.length; i++)

}

return null

}複製**

方案一 :深度優先遍歷

根據先進後出原則,我們從右即左,按深度方式便利 (找到終止迴圈break)。

/ 非遞迴演算法 深度優先

function dfs(tree, name);

stack.push(tree)

while(stack.length != 0)

let children = item.children;

if(children)

}} return result

}複製**

方案二 :廣度優先遍歷

根據先進先出原則,我們從上到下,按層級一層一層往下遍歷 (找到終止迴圈break)

// 非遞迴演算法 廣度優先

function bfs(tree,name);;

queue.unshift(tree);

while(queue.length!=0)

var children=item.children;

if(children)

}} return result

}複製**

深度優先演算法佔記憶體少但速度較慢,廣度優先演算法佔記憶體多但速度較快,在距離和深度成正比的情況下能較快地求出最優解。

深搜優缺

能找出所有解決方案

優先搜尋一棵子樹,然後是另一棵,所以和廣搜對比,有著記憶體需要相對較少的優點

要多次遍歷,搜尋所有可能路徑,標識做了之後還要取消。

在深度很大的情況下效率不高

廣搜優

對於解決最短或最少問題特別有效,而且尋找深度小

每個結點只訪問一遍,結點總是以最短路徑被訪問,所以第二次路徑確定不會比第一次短

記憶體耗費量大(需要開大量的陣列單元用來儲存狀態)

深度優先遍歷 和 廣度優先遍歷

圖的廣度優先搜尋是樹的按層次遍歷的推廣,它的基本思想是 首先訪問初始點vi,並將其標記為已訪問過,接著訪問vi的所有未被訪問過的鄰接點 vi1,vi2,vi t,並均標記已訪問過,然後再按照vi1,vi2,vi t的次序,訪問每乙個頂點的所有未被訪問過的鄰接點,並均標記為已訪問過,依次類推,直到圖中...

廣度優先遍歷和深度優先遍歷

深度優先遍歷 廣度優先遍歷是圖的一種遍歷方式,它的思想就是遍歷這個點相鄰的所有的點,再對這些點進行廣度優先遍歷.如下圖所示 首先我們從a點開始遍歷,然後遍歷所有和a相鄰的點f和點g 然後對f和點g進行遍歷進行遍歷,得到點e,h,k和b 然後再繼續,知道所有的點都遍歷完成 首先,我們先定義圖graph...

廣度優先遍歷和深度優先遍歷

1.1 概念 以初始節點v0作為第一層節點,接著訪問它。然後迭代第一層節點即v0,訪問它相鄰接的沒有訪問過的節點比如v1,v2,v1,v2加入到第二層節點 迭代第二層節點v1,v2,v1,v2依次訪問相鄰接的沒有訪問過的節點,重複上述步驟直至所有節點都被訪問過為止。如圖所示首先訪問根節點v0,並將v...