最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實現(xiàn)LeetCode(103.二叉樹的之字形層序遍歷)

 更新時間:2021年07月21日 15:29:32   作者:Grandyang  
這篇文章主要介紹了C++實現(xiàn)LeetCode(103.二叉樹的之字形層序遍歷),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下

[LeetCode] 103. Binary Tree Zigzag Level Order Traversal 二叉樹的之字形層序遍歷

Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).

For example:
Given binary tree [3,9,20,null,null,15,7],

    3
/ \
9  20
/  \
15   7

return its zigzag level order traversal as:

[
[3],
[20,9],
[15,7]
]

這道二叉樹的之字形層序遍歷是之前那道 Binary Tree Level Order Traversal 的變形,不同之處在于一行是從左到右遍歷,下一行是從右往左遍歷,交叉往返的之字形的層序遍歷。最簡單直接的方法就是利用層序遍歷,并使用一個變量 cnt 來統(tǒng)計當前的層數(shù)(從0開始),將所有的奇數(shù)層的結(jié)點值進行翻轉(zhuǎn)一下即可,參見代碼如下:

解法一:

class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        if (!root) return {};
        vector<vector<int>> res;
        queue<TreeNode*> q{{root}};
        int cnt = 0;
        while (!q.empty()) {
            vector<int> oneLevel;
            for (int i = q.size(); i > 0; --i) {
                TreeNode *t = q.front(); q.pop();
                oneLevel.push_back(t->val);
                if (t->left) q.push(t->left);
                if (t->right) q.push(t->right);
            }
            if (cnt % 2 == 1) reverse(oneLevel.begin(), oneLevel.end());
            res.push_back(oneLevel);
            ++cnt;
        }
        return res;
    }
};

我們可以將上面的解法進行優(yōu)化一下,翻轉(zhuǎn)數(shù)組雖然可行,但是比較耗時,假如能夠直接計算出每個結(jié)點值在數(shù)組中的坐標,就可以直接進行更新了。由于每層的結(jié)點數(shù)是知道的,就是隊列的元素個數(shù),所以可以直接初始化數(shù)組的大小。此時使用一個變量 leftToRight 來標記順序,初始時是 true,當此變量為 true 的時候,每次加入數(shù)組的位置就是i本身,若變量為 false 了,則加入到 size-1-i 位置上,這樣就直接相當于翻轉(zhuǎn)了數(shù)組。每層遍歷完了之后,需要翻轉(zhuǎn) leftToRight 變量,同時不要忘了將 oneLevel 加入結(jié)果 res,參見代碼如下:

解法二:

class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        if (!root) return {};
        vector<vector<int>> res;
        queue<TreeNode*> q{{root}};
        bool leftToRight = true;
        while (!q.empty()) {
            int size = q.size();
            vector<int> oneLevel(size);
            for (int i = 0; i < size; ++i) {
                TreeNode *t = q.front(); q.pop();
                int idx = leftToRight ? i : (size - 1 - i);
                oneLevel[idx] = t->val;
                if (t->left) q.push(t->left);
                if (t->right) q.push(t->right);
            }
            leftToRight = !leftToRight;
            res.push_back(oneLevel);
        }
        return res;
    }
};

我們也可以使用遞歸的方法來解,這里實際上用的是先序遍歷,遞歸函數(shù)需要一個變量 level 來記錄當前的深度,由于 level 是從0開始的,假如結(jié)果 res 的大小等于 level,就需要在結(jié)果 res 中新加一個空集,這樣可以保證 res[level] 不會越界。取出 res[level] 之后,判斷 levle 的奇偶,若其為偶數(shù),則將 node->val 加入 oneLevel 的末尾,若為奇數(shù),則加在 oneLevel 的開頭。然后分別對 node 的左右子結(jié)點調(diào)用遞歸函數(shù),此時要傳入 level+1 即可,參見代碼如下:

解法三:

class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        vector<vector<int>> res;
        helper(root, 0, res);
        return res;
    }
    void helper(TreeNode* node, int level, vector<vector<int>>& res) {
        if (!node) return;
        if (res.size() <= level) {
            res.push_back({});
        }
        vector<int> &oneLevel = res[level];
        if (level % 2 == 0) oneLevel.push_back(node->val);
        else oneLevel.insert(oneLevel.begin(), node->val);
        helper(node->left, level + 1, res);
        helper(node->right, level + 1, res);
    }
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/103

類似題目:

Binary Tree Level Order Traversal

參考資料:

https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/

https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/discuss/33815/My-accepted-JAVA-solution

https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/discuss/33825/c%2B%2B-5ms-version%3A-one-queue-and-without-reverse-operation-by-using-size-of-each-level

到此這篇關(guān)于C++實現(xiàn)LeetCode(103.二叉樹的之字形層序遍歷)的文章就介紹到這了,更多相關(guān)C++實現(xiàn)二叉樹的之字形層序遍歷內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C?與?C++?中的?const?常量與數(shù)組大小的關(guān)系對比分析

    C?與?C++?中的?const?常量與數(shù)組大小的關(guān)系對比分析

    C和C++中數(shù)組大小通常要求是一個編譯時常量,C語言中,const變量不能直接作為數(shù)組大小,需要使用#define或enum,C++中,const變量被視為常量表達式,可以作為數(shù)組大小,本文介紹C?與?C++?中的?const?常量與數(shù)組大小的關(guān)系,感興趣的朋友一起看看吧
    2025-02-02
  • c++實現(xiàn)圖像像素計算的示例詳解

    c++實現(xiàn)圖像像素計算的示例詳解

    我們知道每張圖像都能夠用矩陣來表示,矩陣中每個元素的值表示了圖像中每個像素值,像素值的大小就對應(yīng)著圖像的亮暗,本文主要來和大家介紹一下C++進行圖像像素計算的相關(guān)知識,感興趣的可以了解下
    2023-12-12
  • VSCode (Visual Studio Code) V1.43.0下載并設(shè)置成中文語言的方法

    VSCode (Visual Studio Code) V1.43.0下載并設(shè)置成中文語言的方法

    Visual Studio Code是一款免費開源的現(xiàn)代化輕量級代碼編輯器,支持語法高亮、智能代碼補全、自定義熱鍵、括號匹配、代碼片段、代碼對比 Diff、GIT 等特性,這篇文章主要介紹了VSCode (Visual Studio Code) V1.43.0下載并設(shè)置成中文語言,需要的朋友可以參考下
    2020-03-03
  • C/C++實現(xiàn)重置文件時間戳

    C/C++實現(xiàn)重置文件時間戳

    這篇文章主要為大家詳細介紹了C/C++實現(xiàn)重置文件時間戳的相關(guān)資料,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以參考一下
    2023-11-11
  • C++開發(fā)protobuf動態(tài)解析工具

    C++開發(fā)protobuf動態(tài)解析工具

    這篇文章主要為大家介紹了C++開發(fā)protobuf動態(tài)解析工具實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • C語言中位域的使用詳解

    C語言中位域的使用詳解

    位域是C語言中的一種高級功能,允許程序員為結(jié)構(gòu)體的成員分配特定數(shù)量的位,本文主要為大家介紹了位域的使用以及優(yōu)缺點,希望對大家有所幫助
    2023-07-07
  • C語言system 自動關(guān)機函數(shù)代碼

    C語言system 自動關(guān)機函數(shù)代碼

    這篇文章主要介紹了C語言system 自動關(guān)機函數(shù)代碼,需要的朋友可以參考下
    2016-04-04
  • 基于QT實現(xiàn)自定義溫度計的示例代碼

    基于QT實現(xiàn)自定義溫度計的示例代碼

    QT原生控件沒有實現(xiàn)如儀表盤或者溫度計的控件,只好自己實現(xiàn),所以本文為大家介紹了如何利用qt實現(xiàn)自定義溫度/濕度控件,感興趣的小伙伴可以了解下
    2023-11-11
  • C語言與C++動態(tài)通訊錄超詳細實現(xiàn)流程

    C語言與C++動態(tài)通訊錄超詳細實現(xiàn)流程

    這篇文章主要為大家介紹了C語言與C++動態(tài)實現(xiàn)通訊錄,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-05-05
  • 字符串的模式匹配詳解--BF算法與KMP算法

    字符串的模式匹配詳解--BF算法與KMP算法

    這篇文章記錄一下串里面的模式匹配,模式匹配,顧名思義就是給定一個被匹配的字符串,然后用一個字符串模式(模型)去匹配上面說的字符串,看后者是否在前者里面出現(xiàn)。常用的有2種算法可以實現(xiàn),下面我們來具體探討下
    2014-08-08

最新評論

合水县| 崇文区| 湘阴县| 陕西省| 镇江市| 民县| 滨州市| 应城市| 平果县| 青岛市| 曲阳县| 临漳县| 定安县| 天台县| 交口县| 韶关市| 滦南县| 兴山县| 云林县| 江津市| 民勤县| 北京市| 枣强县| 讷河市| 神农架林区| 五峰| 四平市| 化州市| 广南县| 富锦市| 鸡东县| 黄石市| 绥中县| 伊通| 夹江县| 方城县| 上饶县| 陵水| 咸宁市| 伊通| 松原市|