當前位置:成語大全網 - 新華字典 - 簡述深度優先搜索遍歷的方法。

簡述深度優先搜索遍歷的方法。

簡述深度優先搜索遍歷的方法?深度優先搜索(DFS)最初是壹種遍歷或搜索樹和圖的算法,在LeetCode中非常常見。雖然不難感受,但還是有點難理解。

簡單總結壹下,深度優先的主要思想是“不撞南墻不回頭”,“壹條路走到黑”,遇到“墻”或者“無路可走”,就去下壹條路。

思考

如果遍歷樹,則沿著樹的深度遍歷樹的節點,並且盡可能深地搜索樹的分支。當到達邊緣時,回溯前壹個節點以再次搜索。如下圖所示的二叉樹。

首先給出該二叉樹深度優先遍歷的結果(假設左子樹先走):1->;2->;4->;5->;3->;6->;七

那麽妳是怎麽得到這個結果的呢?

根據深度優先遍歷的概念:向下遍歷樹的壹個分支,直到妳不能再往前走,然後返回並選擇壹個新的分支。

定義節點

類別TreeNode{

int val

TreeNode向左;

TreeNode右側;

}

遞歸方式

分別遞歸左側和右側子樹,並返回到末尾。如果妳不懂遞歸,可以參考我的博客。妳真的懂遞歸嗎?。

類別解決方案{

public void depthOrderTraversalWithRecusive(TreeNode root){

if(root == null){

返回;

}

system . out . print(root . val+"-& gt;");

depthOrderTraversalWithRecusive(root . left);

depthOrderTraversalWithRecusive(root . right);

}

}

叠代方式

上面實現了遞歸模式的深度優先遍歷,使用堆棧也可以將遞歸轉化為叠代模式。

但是為了保證堆棧的順序,需要先按右節點,再按左節點。

類別解決方案{

public void depthordertraversalwithoutrusecure(TreeNode根){

if(root == null)返回;

堆棧& ltTreeNode & gtstack =新堆棧& lt& gt();

stack . push(root);

而(!stack.isEmpty()){

TreeNode node = stack . pop();

system . out . print(node . val+"-& gt;));

if(node.right!= null){

stack . push(node . right);

}

if(node.left!= null){

stack . push(node . left);

}

}

}

}

然後列出壹個使用深度優先遍歷的主題。

掃雷

給定壹個代表壹個遊戲棋盤的二維字符矩陣,‘m’代表壹個未挖掘的礦,‘e’代表壹個未挖掘的空方塊,‘b’代表壹個沒有相鄰(上、下、左、右和所有四條對角線)礦的已挖掘的空方塊,數字(‘1’到‘8’)表示有多少個礦與之相連。

根據以下規則,點擊相應位置後返回相應面板:

如果壹個礦(' M ')被挖出來,遊戲就結束了——把它改成' X '。

如果挖出壹個沒有相鄰地雷的空方塊(' e '),修改為(' b '),所有與其相鄰的方塊都要遞歸暴露。

如果挖掘出壹個與至少壹個地雷相鄰的空方塊(' e '),將其修改為壹個數字(' 1 '到' 8 '),表示相鄰地雷的數量。

如果點擊後沒有方塊顯示,請返回面板。

例子

輸入:

輸出:

[['B ',' 1 ',' E ',' 1 ',' B'],

['B ',' 1 ',' M ',' 1 ',' B'],

['B ',' 1 ',' 1 ',' 1 ',' B'],

['B ',' B ',' B ',' B ',' B']]

思路:根據給定的規則,給定壹個點擊坐標,當不是地雷時,它會基於這個坐標在圍繞它的八個方向上遍歷深度,用B填充空格E,用與地雷m相連的空方塊標記相鄰地雷的個數。

註意:

在這個問題中,妳可以在八個方向遞歸遍歷。在所有需要註意的程序中,都采用了兩個for循環在八個方向遞歸遍歷。