leetcode深度遍歷

2021-10-24 07:32:53 字數 3685 閱讀 8521

深度優先演算法

深度優先搜尋屬於圖演算法的一種,是乙個針對圖和樹的遍歷演算法,英文縮寫為dfs即depth first search

過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次。

常用的演算法模板

//深度優先搜尋dfs

class

solution

//符合終止條件或已訪問過該節點,退出

source[x]

[y]=

'0';

//對已訪問的節點進行標記,可以直接在原節點上修改,也可以使用乙個visited陣列進行標記..

....

//此處為對目標節點的操作,如賦值,讀取數等

dfs(source,x+

1,y)

;//遞迴搜尋下一次遍歷節點

dfs(source,x-

1,y);.

....

.}public

intresult

(char

source)}}

return res;

}}

二叉樹的最大深度

class

solution

public

void

dfs(treenode root,

int d)

}

對稱二叉樹

給定乙個二叉樹,檢查它是否是映象對稱的。

例如,二叉樹 [1,2,2,3,4,4,3] 是對稱的。

1/ \

2 2/ \ / \

3 4 4 3

注意之前寫這個題老是陷入乙個誤區

就是 比較root節點的左右問題 就造成 問題的無解

這樣的**主要是對 對稱樹的條件提取的錯誤

public boolean issymmetric(treenode root)
正確的 映象樹實際上應該是

class

solution

public

boolean

dfs(treenode left,treenode right)

}

島嶼數量

給你乙個由 『1』(陸地)和 『0』(水)組成的的二維網格,請你計算網格中島嶼的數量。

島嶼總是被水包圍,並且每座島嶼只能由水平方向或豎直方向上相鄰的陸地連線形成。

此外,你可以假設該網格的四條邊均被水包圍。

class

solution

}return nums;

}public

void

dfs(

char c[

],int i,

int j)

if(c[i]

[j]==

'0')

//不是島

return

;else

}}

查並集也可以解決 這個為題

這個演算法很有意思 查並集的江湖紛爭

驗證搜尋二叉樹

** 實際上每次遍歷完 我們總是可以把當前節點的子樹的最大值提取出來

然後到達根 在和它比 到達右子樹時候 恰好 根中的最大值也已經賦給了min **

實際上該題就是中序遍歷然後 用乙個min變數時刻儲存著 樹中的最小值

搜尋二叉樹的中序遍歷就是乙個遞增的序列

class solution 

public boolean mid(treenode root)

}

二叉樹的右檢視

這題最容易想到的做法肯定的廣度遍歷了

但是感覺深度遍歷做這種題目好有意思

class

solution

private

void

dfs(treenode root,

int depth)

// 先訪問 當前節點,再遞迴地訪問 右子樹 和 左子樹。

//這個判斷真的是神了 ..........

if(depth == res.

size()

) depth++

;dfs

(root.right, depth)

;dfs

(root.left, depth);}

}

島的最大

幾乎和島嶼數量是同樣的模板 就是多加了 乙個當前島嶼的面積的tmp變數

和nums表示的是最大島嶼

class

solution}}

return nums;

}public

void

dfs(

int c[

],int i,

int j)

if(c[i]

[j]==0)

//不是島

return

;else

}}

子集

class

solution

public

void

dfs(

int[

] nums,

int i, linkedlist

tmp, list

> res)

dfs(nums, i +

1, tmp, res)

; tmp.

removelast()

;}}public

boolean

baohan

(list tmp,

int i)

public

boolean

baohan2

(list

> tmp,list

s)//結果陣列和新要新增的陣列不能重複

return

false;}

}

被圍繞的區域

題目中解釋說被包圍的區間不會存在於邊界上,所以我們會想到邊界上的 o 要特殊處理,只要把邊界上的 o 特殊處理了,那麼剩下的 o替換成 x 就可以了。

問題轉化為,如何尋找和邊界聯通的 o

class

solution}}

} system.out.

println

(arrays.

deeptostring

(board));

for(

int i =

0; i }public

void

dfs(

char

board,

int i,

int j)

}}

深度遍歷和廣度遍歷

圖的遍歷,所謂遍歷,即是對結點的訪問。乙個圖有那麼多個結點,如何遍歷這些結點,需要特定策略,一般有兩種訪問策略 深度優先遍歷,從初始訪問結點出發,我們知道初始訪問結點可能有多個鄰接結點,深度優先遍歷的策略就是首先訪問第乙個鄰接結點,然後再以這個被訪問的鄰接結點作為初始結點,訪問它的第乙個鄰接結點。總...

深度優先遍歷

第一步 從開始節點查詢可達節點,如果有沒到過的可達節點則第二部,否則第三步 第二部 便利到下乙個可達節點,記錄下該節點已經到達節點 第三步 回到上一步的節點再從第一步開始 乙個節點對應他的可達節點用map表示,map的key和value分別是integer和list 用來存放key對應的節點 遍歷過...

深度優先遍歷

深度優先遍歷很容易列出所有可能 這裡我們分情況 標註幾個易錯的點 不重複組合 不重複組合 則表明 如果我們取k 3 取n1 n2 n3 則n1從1 9中任取 但n1需要排除n1 同理n3需要排除n1 n2 如下 public static void dfs3 int start,listnums,l...