欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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]
]

這道二叉樹(shù)的之字形層序遍歷是之前那道 Binary Tree Level Order Traversal 的變形,不同之處在于一行是從左到右遍歷,下一行是從右往左遍歷,交叉往返的之字形的層序遍歷。最簡(jiǎn)單直接的方法就是利用層序遍歷,并使用一個(gè)變量 cnt 來(lái)統(tǒng)計(jì)當(dāng)前的層數(shù)(從0開(kāi)始),將所有的奇數(shù)層的結(jié)點(diǎn)值進(jìn)行翻轉(zhuǎn)一下即可,參見(jià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;
    }
};

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

解法二:

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;
    }
};

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

解法三:

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

相關(guān)文章

  • C++冒泡排序算法實(shí)例

    C++冒泡排序算法實(shí)例

    這篇文章主要介紹了C++冒泡排序算法實(shí)例,本文先是介紹了什么是冒泡排序,然后給出了實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2014-10-10
  • C++實(shí)現(xiàn)LeetCode(189.旋轉(zhuǎn)數(shù)組)

    C++實(shí)現(xiàn)LeetCode(189.旋轉(zhuǎn)數(shù)組)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(189.旋轉(zhuǎn)數(shù)組),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語(yǔ)言Static?關(guān)鍵字解析

    C語(yǔ)言Static?關(guān)鍵字解析

    這篇文章主要介紹了C語(yǔ)言Static?關(guān)鍵字解析,C語(yǔ)言中staic關(guān)鍵字很簡(jiǎn)單,簡(jiǎn)單到你的任何一個(gè)項(xiàng)目中可以不寫一個(gè)staic關(guān)鍵字也是沒(méi)有問(wèn)題的。寫這篇章主要是一下自己的staic的理解和應(yīng)用,當(dāng)然在章開(kāi)頭依舊要照本宣科簡(jiǎn)述一下static關(guān)鍵字,需要的朋友可以參考一下
    2022-02-02
  • C++中的偽隨機(jī)數(shù)

    C++中的偽隨機(jī)數(shù)

    這篇文章主要介紹了C++中的偽隨機(jī)數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 矩陣的行主序與列主序的分析

    矩陣的行主序與列主序的分析

    這篇文章主要介紹了矩陣的行主序與列主序的分析的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • 深入講解C++數(shù)據(jù)類型轉(zhuǎn)換的相關(guān)函數(shù)的知識(shí)

    深入講解C++數(shù)據(jù)類型轉(zhuǎn)換的相關(guān)函數(shù)的知識(shí)

    這篇文章主要介紹了深入講解C++數(shù)據(jù)類型轉(zhuǎn)換的相關(guān)函數(shù)的知識(shí),包括類型轉(zhuǎn)換運(yùn)算符函數(shù)等內(nèi)容,需要的朋友可以參考下
    2015-09-09
  • C++設(shè)計(jì)模式之原型模式

    C++設(shè)計(jì)模式之原型模式

    這篇文章主要介紹了C++設(shè)計(jì)模式之原型模式,本文講解了什么是原型模式、為什么要使用原型模式、代碼實(shí)例等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • C++實(shí)現(xiàn)Go的defer功能(示例代碼)

    C++實(shí)現(xiàn)Go的defer功能(示例代碼)

    defer和go一樣都是Go語(yǔ)言提供的關(guān)鍵字。defer用于資源的釋放,會(huì)在函數(shù)返回之前進(jìn)行調(diào)用。接下來(lái)通過(guò)本文給大家介紹C++實(shí)現(xiàn)Go的defer功能,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • C/C++?QT實(shí)現(xiàn)解析JSON文件的示例代碼

    C/C++?QT實(shí)現(xiàn)解析JSON文件的示例代碼

    JSON是一種輕量級(jí)的數(shù)據(jù)交換格式,它是基于ECMAScript的一個(gè)子集,使用完全獨(dú)立于編程語(yǔ)言的文本格式來(lái)存儲(chǔ)和表示數(shù)據(jù)。這篇文章主要介紹了QT實(shí)現(xiàn)解析JSON文件的示例代碼,需要的可以參考一下
    2022-01-01
  • 在Linux下編譯C或C++程序的教程

    在Linux下編譯C或C++程序的教程

    這篇文章主要介紹了在Linux下編譯C或C++程序的教程,是C/C++入門學(xué)習(xí)中的必備知識(shí),需要的朋友可以參考下
    2015-07-07

最新評(píng)論