在很多問題中,我們都要對所有情況進行遍歷,二叉樹是其中的一項,再比如矩陣類。正好每日一題做到了,就順便拿出來總結一下遍歷。
概念性的東西我就不說了,直接說我的理解,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...