題目:
分析:
看到這個題目我第一反應是遞迴,不過貌似好像大概還有挺多不同的解法。本篇文章記錄一下我的遞迴思路,其他的演算法留待日後學習。
力扣上給出的空方法模板的返回值為list>,結合題幹可知,每一層的節點數值應按順序存入乙個集合中,所有的節點集合也要儲存在乙個集合中。
那麼問題來了,對於方法而言,二叉樹的層數是未知的,那麼應該建立多少個節點集合呢?可以先用遞迴來求一下二叉樹的最長路徑,但是,考慮到時間複雜度和空間複雜度的話,我否定了這個想法。
最終我選擇在遞迴中建立節點集合,當訪問到每一層的最左節點時,建立該層的節點集合,方法就是通過乙個int值來記錄二叉樹的層數,當到達二叉樹的第一層(頂層)時,int為0,此時集合內尚未建立頂層節點集合,事實上這個時候集合內沒有任何節點集合,所以它的size為0,以此類推,我們分析可知,當集合的size小於等於當前層數記錄(也就是int值)的時候,需要建立當前層的節點集合。
當遞迴訪問下一層時,需將當前層數記錄+1傳給遞迴方法。
最終由於集合最先新增的是頂層節點的集合,最後新增的是最底層葉子節點的集合,所以按照題目要求,最終需要將集合倒序排列。
題解:
/*** definition for a binary tree node.
* public class treenode
* } */
class
solution
public
void getval(treenode root, list> lists, int
curr)
if (lists.size() <=curr)
lists.get(curr).add(root.val);
getval(root.left, lists, curr + 1);
getval(root.right, lists, curr + 1);
}}
本篇小結:
其實,這些二叉樹、遞迴什麼的概念之前一直是知道的,但也僅限於知道而已,可以說沒有真正的好好練習和應用過,最近學習演算法的時候有幾次用到,沒想到還挺香~
不過在做這道演算法題的時候,還是小小的糾結了一下,我當時的疑惑是遞迴方法會按照我預想的順序執行嗎?
假設現在有乙個二層的二叉樹:
6/ \
7 8
我希望的執行順序是先將6新增進集合,再將7新增進集合,最後將8新增進集合。
在遞迴方法中首先將6新增進集合,然後依次呼叫了訪問節點7和節點8的遞迴,雖然**是有先後次序,但是方法執行時會按照次序執行嗎?
在實踐中發現,是我想多了,頓時覺得心情舒暢,看來以後可以更加愉快的使用遞迴了!
第二個收穫就是又發現了乙個寶藏方法collections.reverse(),將集合倒序重排,愛了愛了。
層次遍歷二叉樹
問題 假定根節點位於第0層 1.層次遍歷二叉樹 每層換行分開 2.層次遍歷二叉樹指定的某層 本文 例如 上圖中1.123 4567 82.第三層 78可以看出得出第二問的解,第一問迎刃而解了,所以從問題二下手 1.層次遍歷二叉樹指定的某層 可以得出這樣的乙個結論 遍歷二叉樹的第k層,相當於遍歷二叉樹...
二叉樹層次遍歷
題目描述 從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。思路 二叉樹的層次遍歷,利用棧的先進後出的特性。struct treenode class solution res.push back temp while m.empty m中是從左往右入棧,這裡把它反過來,s中是從右往左...
二叉樹層次遍歷
層次遍歷二叉樹,每一次儲存在list中,結果按從葉子層到根,從左到右的順序儲存 一 class solution return lists 相當於在先序的基礎上改進,level是每個node所在的層次。如果lists大小和level相等,說明開始新一層的儲存。如果不等,則直接把值存入相應層次的lis...