二叉樹的層次遍歷,輸出乙個 list 的 list。
這道題考的就是 bfs,我們可以通過 dfs 實現。只需要在遞迴過程中將當前 level 傳入即可。
public list
>
levelorder
(treenode root)
private
void
dfs(treenode root,
int level, list
> ans)
//當前層數還沒有元素,先 new 乙個空的列表
if(ans.
size()
<=level)
//當前值加入
ans.
get(level)
.add
(root.val)
;dfs
(root.left,level+
1,ans)
;dfs
(root.right,level+
1,ans)
;}
如果是順序刷題,前邊的 97 題,98 題,101 題,都用到了 bfs ,應該很熟悉了。
之前我們用乙個 while 迴圈,不停的從佇列中拿乙個節點,並且在迴圈中將當前取出來的節點的左孩子和右孩子也加入到佇列中。
相比於這道題,我們要解決的問題是,怎麼知道當前節點的 level 。
定義乙個新的 class,class 裡邊兩個成員 node 和 level,將我們新定義的 class 每次加入到佇列中。或者用乙個新的佇列和之前的節點佇列同步入隊出隊,新的佇列儲存 level。
下邊的**實現後一種。
public list
>
levelorder
(treenode root)
queue
treenode =
newlinkedlist
<
>()
; queue
nodelevel =
newlinkedlist
<
>()
; treenode.
offer
(root)
;int level =0;
nodelevel.
offer
(level)
;while
(!treenode.
isempty()
) ans.
get(curlevel)
.add
(curnode.val)
; level = curlevel +1;
treenode.
offer
(curnode.left)
; nodelevel.
offer
(level)
; treenode.
offer
(curnode.right)
; nodelevel.
offer
(level);}
}return ans;
}
參考這裡。
我們在 while 迴圈中加乙個 for 迴圈,迴圈次數是迴圈前的佇列中的元素個數即可,使得每次的 while 迴圈出隊的元素都是同一層的元素。
for 迴圈結束也就意味著當前層結束了,而此時的佇列儲存的元素就是下一層的所有元素了。
public list
>
levelorder
(treenode root)}if
(sublist.
size()
>0)
}return ans;
}
考察的知識點就是二叉樹的 bfs,解法二的方案二是自己不曾想到的, while 迴圈中加入乙個 for 迴圈,很妙!
更多詳細通俗題解詳見 leetcode.wang 。
力扣102 二叉樹的層序遍歷
最近在學習資料結構樹的相關知識,於是就去力扣刷題。我是一枚蒟蒻,一天時間琢磨出來兩題 慚愧 現在分享一下解題過程,大佬勿噴 給你乙個二叉樹,請你返回其按層序遍歷得到的節點值。即逐層地,從左到右訪問所有節點 示例 二叉樹 3,9,20,null,null,15,7 直接上 definition for...
力扣No 102 二叉樹的層次遍歷
給你乙個二叉樹,請你返回其按 層序遍歷 得到的節點值。即逐層地,從左到右訪問所有節點 示例 二叉樹 3,9,20,null,null,15,7 3 9 20 15 7 返回其層次遍歷結果 3 9,20 15,7 這道題有兩種解法 遞迴和遍歷 遞迴可以用level和list去存每層的節點,如果這層節點...
LeetCode 力扣 110 平衡二叉樹
判斷一棵樹是否是平衡二叉樹,平衡二叉樹定義如下 它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過 1,並且左右兩個子樹都是一棵平衡二叉樹。直接按照定義來吧,並且多定義乙個求高度的函式,之前在 104 題 做過。public boolean isbalanced treenode root 它的左...