借助leetcode題目來了解BFS和DFS

2022-05-06 07:36:09 字數 3249 閱讀 3379

-對於樹而言,就是一種層層遍歷的感覺,在實現的過程中,常常借助的是輔助佇列來實現,也就是借助先進先出的特性來實現的。下圖來看。用bfs的話,就是3-9-20-15-7的結果。

整體實現來說,就是遍歷root再來遍歷左右子樹,不過與dfs區別的是,這裡是借助先進先出的特點,也就是要將前面的先排列出來,不用走到葉子結點才輸出。一句話簡單來說,bfs就是佇列,入佇列,出佇列;

下面是借助leetcode的題目來鞏固這個知識點,上面的圖也是這個題的。題目要求層層從左往右遍歷結點。

class solution 

//用佇列來實現廣度優先搜尋

arraylistlist = new arraylist<>();

queuequeue = new linkedlist<>();

queue.add(root);

while(!queue.isempty())

if(node.right != null)

}// 這樣轉換會慢一點

// int res = list.stream().maptoint(integer::valueof).toarray();

int res = new int[list.size()];

for(int i = 0; i < list.size();i++)

//題目要求返回的是int

return res;}}

}

上面這道可以變形成輸出結果不一樣,也就是劍指offer中的後面兩道-面試題31 - ii. 從上到下列印二叉樹和面試32題。

31題是要求輸出的結果是不同陣列的集合,每層的結點作為乙個陣列,解決**如下

class solution 

//用佇列來實現廣度優先搜尋

queuequeue = new linkedlist<>();

queue.add(root);

while(!queue.isempty())

if(node.right != null)

}//每層加完就新增到結果裡面

res.add(list);

}//題目要求返回的是list>

return res;}}

32題有和上面不一樣的地方在於,第一行按照從左到右的順序列印,第二層按照從右到左的順序列印,第三行再按照從左到右的順序列印,其他行以此類推。就是奇數偶數層不一樣的遍歷方式。可以通過借助乙個布林常量來實現。

class solution 

//用佇列來實現廣度優先搜尋

queuequeue = new linkedlist<>();

queue.add(root);

boolean flag = true;

while(!queue.isempty())else

// 逐個入列,輔助佇列也是bfs的關鍵點

if(node.left != null)

if(node.right != null)

}//每次遍歷完一行便開始更換布林型別

flag = !flag;

//每層加完就新增到結果裡面

res.add(list);

}//題目要求返回的是list>a

return res;}}

講到dfs,很容易想到遞迴,沒錯它就是借助了遞迴的思想。在圖中的描述是:深度優先搜尋在搜尋過程中訪問某個頂點後,需要遞迴地訪問此頂點的所有未訪問過的相鄰頂點。

上面的圖即是該題,題目要求輸入乙個目標sum,列印出二叉樹中節點值的和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉節點所經過的節點形成一條路徑。

比如給出22,則返回下面

/**

leetcode 二叉樹中和為某一值的路徑(劍指offer34題)

* definition for a binary tree node.

* public class treenode

* }*/class solution

public void recur(treenode root,int sum)

path.add(root.val);

sum -= root.val;

//找到了最後葉子結點,且可以滿足sum的和要求,便將該結果新增進去res

if (sum == 0&& root.left ==null&&root.right == null)

// 左子樹遞迴

recur(root.left,sum);

// 右子樹遞迴

recur(root.right,sum);

// 刪掉上乙個結點,這一步是比較難理解的,這一步有點回溯的感覺,就是你找到最後不符合要求的結點,你要返回到上一步,重新走下去。這一步是左右子樹都遞迴完成後就會執行的

path.removelast();}}

這裡的dfs還沒講完,只是單純講了這一道,後面再補上一些題目來寫。

這個題是要求求樹的深度,可以很好得對比bfs和dfs的做法,例項如下。

直接上**,格式和模板都和上面的差不多。

public int maxdepth(treenode root) 

queuequeue = new linkedlist<>();

queue.add(root);

int num = 0;

while(!queue.isempty())

if(node.right != null)}}

return num;

}//dfs 只有這兩行。

// 時間複雜度為o(n),

if(root == null)else

leetcode 排序題目

merge k sorted lists insertion sort list sort list first missing positive sort colors 147.insertion sort list sort a linked list using insertion sort....

leetCode題目解析

給出兩個非空的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式儲存的,並且它們的每個節點只能儲存一位數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 7 0 8原...

leetcode程式設計題目

題目分析 給出乙個字串,求出最長的沒有重複字元的子串。解題思路 記錄法 首先我們必須知道怎麼判斷乙個子串的字元是否都只出現一次可以開乙個足夠大的布林陣列,然後每個字元是否出現記錄在對應ascll碼值的下標位置,初始化陣列都為0一旦遍歷到某個字元ch,若arr ch 1則表示ch已經在之前出現過,那我...