二叉樹的層序遍歷 bfs和dfs起始章節

2021-10-06 02:42:37 字數 1641 閱讀 9687

在很多問題中,我們都要對所有情況進行遍歷,二叉樹是其中的一項,再比如矩陣類。正好每日一題做到了,就順便拿出來總結一下遍歷。

概念性的東西我就不說了,直接說我的理解,bfs就是從此點往四周遍歷,就像水波往外擴散,特點就是先近後遠,適合最短距離這種的。怎麼實現?佇列,先進先出,離得近的先進,近的下乙個進,迴圈。

上本題。

題目:

給你乙個二叉樹,請你返回其按 層序遍歷 得到的節點值。 (即逐層地,從左到右訪問所有節點)。

示例:二叉樹:[3,9,20,null,null,15,7],3/

9 20

/ 15 7

返回其層次遍歷結果:

[[3],

[9,20],

[15,7]

]思路:

層層遍歷,也就是一層一層的輸出,這個有點棘手的地方在於,你需要將每層輸出,所以你要記錄每層的個數,然後挨個輸出。

思路就來了,申請乙個佇列,先將root推入,然後開始遍歷,以佇列空為結束。每次要記住該層的個數,因為佇列中會持續進入,所以要記住每層的個數。

/**

* definition for a binary tree node.

* struct treenode

* };

*/class

solution

res.

push_back

(vec);}

return res;}}

;

我嘗試著用兩個佇列來實現不用記住層中點的個數,雖然**龐大了些許,但畢竟實現了。

class

solutionif(

!vec1.

empty()

)//有元素才輸出

vec1.

clear()

;//清理

while

(!q2.

empty()

)if(!vec1.

empty()

) vec1.

clear()

;}return res;}}

;

dfs就簡單許多了,一直往下遞迴,遞迴到最後。有乙個需要注意的點是我們是從左往右的,所以我們每次都先左遞迴,然後往右。重點就是要記住自己在哪一層,下面引數裡的level。

class

solution

void

dfs(vectorint>>

& res,treenode* root,

int level)

res[level]

.push_back

(root-

>val)

;//此處的level是關鍵,每次都遞迴到此就輸出此層

dfs(res,root-

>left,level+1)

;dfs

(res,root-

>right,level+1)

;}};

說到底,還是遍歷的問題,擴散遍歷和縱深遍歷,有時候會有剪枝問題,也就是不符合條件的擴散可以直接掐掉此路,遞迴就是回溯回上一步。這些之前的部落格裡也都有提到過。

知識都是發散和總結出來的,加油。

二叉樹的層序遍歷 二叉樹 BFS

給你乙個二叉樹,請你返回其按 層序遍歷 得到的節點值。即逐層地,從左到右訪問所有節點 示例 二叉樹 3,9,20,null,null,15,7 返回其層次遍歷結果 3 9,20 15,7 在用bfs迴圈遍歷時。先記錄現在佇列裡面的元素個數n,n就是此二叉樹這一深度擁有的節點數,然後迴圈n次,把n個節...

二叉樹DFS和BFS遍歷

public class treenode bfs廣度優先遍歷 使用queue實現bfs public void bfswithqueue treenode root dfs 深度優先遍歷 採用 遞迴棧 或者 棧 遞迴棧 dfs遞迴實現 public void dfswithrecursion tr...

二叉樹層序遍歷 求二叉樹的層序遍歷

給定乙個二叉樹,返回該二叉樹層序遍歷的結果,從左到右,一層一層地遍歷 例如 給定的二叉樹是,該二叉樹層序遍歷的結果是 3 9,20 15,7 示例1 輸入 返回值 1 2 示例2輸入 返回值 1 2,3 4,5 解題思路 重點是如何把在一層的節點放到一起,設定乙個引數專門放一層的節點 class t...