樹的層序遍歷并統(tǒng)計(jì)每一層的值

說(shuō)明

連續(xù)在LeetCode中看到好幾個(gè)類似的題目,核心思想就是樹的廣度優(yōu)先搜索(BFS)滓彰,并在搜索的過(guò)程中記錄每一層的值怕享。
以LeetCode中的N-ary Tree Level Order Traversal為例:

Description

Given an n-ary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).

For example, given a 3-ary tree:


example-img

We should return its level order traversal:

[
    [1],
    [3,2,4],
    [5,6]
]

解析

利用隊(duì)列使用BFS。設(shè)res為要返回的2維數(shù)組, vec為當(dāng)前訪問(wèn)層的元素的1維數(shù)組绽昼。

  1. count為當(dāng)前層的節(jié)點(diǎn)數(shù)量芭商,初始化為0派草,newCount為新加入的一層的節(jié)點(diǎn)數(shù)量,初始化為0蓉坎,c為當(dāng)前訪問(wèn)層的第幾個(gè)元素澳眷,初始化為0.
  2. 根節(jié)點(diǎn)入隊(duì)胡嘿,++count, 根節(jié)點(diǎn)元素加入到vec中
  3. 如果c等于count,將1維數(shù)組vec加入到res中蛉艾,并使 count = newCount, c = 0, newCount = 0, 再清空vec
  4. 隊(duì)列中的第一個(gè)元素出隊(duì),并賦值給p衷敌,對(duì)于p中的每一個(gè)子節(jié)點(diǎn)勿侯,如果不為空則進(jìn)隊(duì)并使newCount = newCount+1
  5. 節(jié)點(diǎn)p的元素加入到vec中, 并讓 c = c + 1
  6. 重復(fù)步驟3-5直到隊(duì)列為空
  7. 如果count大于0缴罗,則將vec中加入到res中

時(shí)間復(fù)雜度: O(n) n為節(jié)點(diǎn)的數(shù)量

C++實(shí)現(xiàn)

/*
// Definition for a Node.
class Node {
public:
    int val = NULL;
    vector<Node*> children;

    Node() {}

    Node(int _val, vector<Node*> _children) {
        val = _val;
        children = _children;
    }
};
*/
class Solution {
public:
    vector<vector<int>> levelOrder(Node* root) {
        vector<vector<int>> res;
        if(root == NULL)
            return res;
        int count = 0;
        int newCount = 0;
        int c = 0;
        vector<int> vec;    // all node`val at same level
        
        queue<Node*> q;
        q.push(root);
        count = 1;
        
        while(!q.empty()){
            if(c == count){
                res.push_back(vec);
                vec.clear();
                count = newCount;
                c = 0;
                newCount = 0;
            }
            auto p = q.front();
            q.pop();
            vec.push_back(p->val);
            for(int i = 0; i < p->children.size(); ++i){
                if(p->children[i] != NULL){
                    q.push(p->children[i]);
                    ++newCount;
                }
            }
            ++c;
        }
        if(count){ // last leavel values
            res.push_back(vec);
        }
        return res;
    }
};
// cin優(yōu)化
static const auto __ = [](){ 
    ios::sync_with_stdio(false); 
    cin.tie(nullptr);
    return nullptr;
}();

這個(gè)題中不得不提一下c++中cin的優(yōu)化問(wèn)題助琐,優(yōu)化代碼如上,主要就是關(guān)閉stdio同步和解除與cout的綁定面氓,這份代碼在LeetCode提交沒優(yōu)化cin之前大概為比20%的提交快兵钮,而開了cin優(yōu)化便幾乎比100%的提交快了...
關(guān)于cin讀取數(shù)據(jù)的問(wèn)題見這篇文章


本作品采用知識(shí)共享署名-非商業(yè)性使用-禁止演繹 4.0 國(guó)際許可協(xié)議進(jìn)行許可。轉(zhuǎn)載請(qǐng)注明: 作者staneyffer舌界,首發(fā)于我的博客掘譬,原文鏈接: https://chengfy.com/post/8

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市呻拌,隨后出現(xiàn)的幾起案子葱轩,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件靴拱,死亡現(xiàn)場(chǎng)離奇詭異垃喊,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)袜炕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門本谜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人偎窘,你說(shuō)我怎么就攤上這事耕突。” “怎么了评架?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵眷茁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我纵诞,道長(zhǎng)上祈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任浙芙,我火速辦了婚禮登刺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嗡呼。我一直安慰自己纸俭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布南窗。 她就那樣靜靜地躺著揍很,像睡著了一般。 火紅的嫁衣襯著肌膚如雪万伤。 梳的紋絲不亂的頭發(fā)上窒悔,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音敌买,去河邊找鬼简珠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛虹钮,可吹牛的內(nèi)容都是我干的聋庵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼芙粱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼祭玉!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起宅倒,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤攘宙,失蹤者是張志新(化名)和其女友劉穎屯耸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蹭劈,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疗绣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铺韧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片多矮。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖哈打,靈堂內(nèi)的尸體忽然破棺而出塔逃,到底是詐尸還是另有隱情,我是刑警寧澤料仗,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布湾盗,位于F島的核電站,受9級(jí)特大地震影響立轧,放射性物質(zhì)發(fā)生泄漏格粪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一氛改、第九天 我趴在偏房一處隱蔽的房頂上張望帐萎。 院中可真熱鬧,春花似錦胜卤、人聲如沸疆导。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)澈段。三九已至,卻和暖如春紫新,著一層夾襖步出監(jiān)牢的瞬間均蜜,已是汗流浹背李剖。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工芒率, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人篙顺。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓偶芍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親德玫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子匪蟀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,745評(píng)論 0 33
  • 各校歷年復(fù)試機(jī)試試題 清華宰僧、北大材彪、華科試題詳細(xì)筆記部分,少筆記部分與少數(shù)leetcode【含個(gè)人整理筆記】 一、詳...
    十里江城閱讀 1,186評(píng)論 0 1
  • LeetCode 刷題隨手記 - 第一部分 前 256 題(非會(huì)員)段化,僅算法題嘁捷,的吐槽 https://leetc...
    蕾娜漢默閱讀 17,787評(píng)論 2 36
  • 冉,是一個(gè)挺聰明的小姑娘显熏。學(xué)習(xí)不錯(cuò)雄嚣,美術(shù),音樂音質(zhì)等都不錯(cuò)的小姑娘喘蟆,就是她父母離異缓升,父母有了各自的家庭后,都不管孩...
    筱秋_4176閱讀 321評(píng)論 0 0
  • 豪言壯語(yǔ)已出蕴轨,怎能辜負(fù)諾言港谊。加油多考一分是一分。別忘了你對(duì)南京的諾言橙弱。
    waterfront閱讀 199評(píng)論 0 1