leetcode演算法總結 DFS深度優先搜尋

2021-10-18 22:58:33 字數 1658 閱讀 7295

自頂向下(根節點到葉子節點)(前序處理)(向下傳參)

自底向上(子節點到子節點) (後序處理)

構建二叉樹

n叉樹模板

dfs

(treenode* root,

int path)

重點解讀:

root->left = *** 才是指向,root = root->left是移動指標遍歷

父節點要傳給子節點值,則放到遞迴的形參中。void dfs(treenode* root, int path)這裡的path是一條路徑的值,如果要定義全域性的值比如累加所有節點的和那麼要放到外面共享變數中。

void dfs(treenode *root, int pathsum, vector& vpath)其中vpath是引用,則他是所有節點共享的,所以在返回的時候要pop出去,如果他不是引用,則他是從根節點到葉子節點的每條路徑都是乙個vpath。具體參考113題

在左右遞迴上面寫的語句是前序遍歷,也就是我們要自頂向下執行順序來執行該語句。在左右遞迴下面的語句屬於後序遍歷,自底向上遍歷處理。這個遍歷順序是根左右就需要看我們dfs(root->left)和dfs(root->right)的順序也可以根右左,dfs(root->right)在dfs(root->left)前面

遞迴條件中放引數作為父節點傳給當前節點的值

同時遍歷兩個樹構建二叉樹模板

通過前/後 和中序遍歷構造二叉樹

treenode *

dfs(vector<

int>

&preorder,

int start,

int end)

//每次遍歷的節點順序要確定.遍歷陣列

rootvalue = nums[i]

;//然後看用什麼順序建立二叉樹:一種是:根->建立左子樹->建立右子樹的順序來建立二叉樹

//前序遍歷建立節點

treenode *root =

newtreenode

(rootvalue)

;//因為是建立二叉樹,需要讓左右子樹指標去指

root-

>left =

dfs(preorder, start, midindex-1)

;//遞迴左子樹為左子樹的所有元素

root-

>right =

dfs(preorder, midindex+

1, end)

;//遞迴右子樹的所有元素放入右子樹

return root;

}

注意構建順序要和遍歷陣列順序相同

n叉樹沒有中序遍歷,如果語句在dfs前則是前序遍歷,如果在dfs後則是後序遍歷

我們使用前序遍歷,注意這裡會先遍歷到最左子節點

void

dfs(node* root,

int level)

result[level]

.push_back

(root-

>val)

;//對子節點進行遍歷

for(

auto child : root-

>children)

}

演算法 dfs總結

用壓棧的方法來進行迭代 最關鍵的是用null標誌來區分每個遞迴呼叫棧,不同遍歷順序只用改變壓棧順序即可 先序遍歷 右節點 左結點 根節點 中序遍歷 右節點 根節點 左結點 後序遍歷 根節點 右節點 左結點 我們在每次處理過的結點壓棧後,在給他後面壓乙個空結點,這樣棧頂元素如果是null就說明他下面的...

DFS 演算法總結

這篇文章會對dfs進行乙個總結,列舉的題目則是從leetcode上面選的 有三個方面,分別是輸入資料 狀態轉換圖 求解目標 輸入資料 如果是遞迴資料結構,如單鏈表,二叉樹,集合,則百分之百可以使用深搜 如果是非遞迴資料結構,比如一維陣列 二維陣列 字串 圖,則概率要小一些 狀態轉換圖 樹或者圖 輸入...

leetcode路徑總和問題總結DFS

leetcode 112 一般來說關於dfs有兩個套路 第乙個就是用recursion來完成,這種在理解上著實也不是很簡單,但是一旦理解了,起飛!第二個的話就是用stack來完成iteration,會比上面好理解,但是複雜度會稍微差一點。思路 此題就是乙個明顯的recursion的問題,我們要從ro...