C++實(shí)現(xiàn)LeetCode(103.二叉樹的之字形層序遍歷)
[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 的變形,不同之處在于一行是從左到右遍歷,下一行是從右往左遍歷,交叉往返的之字形的層序遍歷。最簡(jiǎn)單直接的方法就是利用層序遍歷,并使用一個(gè)變量 cnt 來統(tǒng)計(jì)當(dāng)前的層數(shù)(從0開始),將所有的奇數(shù)層的結(jié)點(diǎn)值進(jìn)行翻轉(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;
}
};
我們可以將上面的解法進(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 來標(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,參見代碼如下:
解法二:
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í)際上用的是先序遍歷,遞歸函數(shù)需要一個(gè)變量 level 來記錄當(dāng)前的深度,由于 level 是從0開始的,假如結(jié)果 res 的大小等于 level,就需要在結(jié)果 res 中新加一個(gè)空集,這樣可以保證 res[level] 不會(huì)越界。取出 res[level] 之后,判斷 levle 的奇偶,若其為偶數(shù),則將 node->val 加入 oneLevel 的末尾,若為奇數(shù),則加在 oneLevel 的開頭。然后分別對(duì) node 的左右子結(jié)點(diǎn)調(diào)用遞歸函數(shù),此時(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/
到此這篇關(guān)于C++實(shí)現(xiàn)LeetCode(103.二叉樹的之字形層序遍歷)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)二叉樹的之字形層序遍歷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++實(shí)現(xiàn)LeetCode(109.將有序鏈表轉(zhuǎn)為二叉搜索樹)
- C++實(shí)現(xiàn)LeetCode(106.由中序和后序遍歷建立二叉樹)
- C++實(shí)現(xiàn)LeetCode(104.二叉樹的最大深度)
- C++實(shí)現(xiàn)LeetCode(101.判斷對(duì)稱樹)
- C++實(shí)現(xiàn)LeetCode(107.二叉樹層序遍歷之二)
- C++實(shí)現(xiàn)LeetCode(102.二叉樹層序遍歷)
- C++實(shí)現(xiàn)LeetCode(100.判斷相同樹)
- C++實(shí)現(xiàn)LeetCode(110.平衡二叉樹)
相關(guān)文章
C?與?C++?中的?const?常量與數(shù)組大小的關(guān)系對(duì)比分析
C和C++中數(shù)組大小通常要求是一個(gè)編譯時(shí)常量,C語言中,const變量不能直接作為數(shù)組大小,需要使用#define或enum,C++中,const變量被視為常量表達(dá)式,可以作為數(shù)組大小,本文介紹C?與?C++?中的?const?常量與數(shù)組大小的關(guān)系,感興趣的朋友一起看看吧2025-02-02
c++實(shí)現(xiàn)圖像像素計(jì)算的示例詳解
我們知道每張圖像都能夠用矩陣來表示,矩陣中每個(gè)元素的值表示了圖像中每個(gè)像素值,像素值的大小就對(duì)應(yīng)著圖像的亮暗,本文主要來和大家介紹一下C++進(jìn)行圖像像素計(jì)算的相關(guān)知識(shí),感興趣的可以了解下2023-12-12
VSCode (Visual Studio Code) V1.43.0下載并設(shè)置成中文語言的方法
Visual Studio Code是一款免費(fèi)開源的現(xiàn)代化輕量級(jí)代碼編輯器,支持語法高亮、智能代碼補(bǔ)全、自定義熱鍵、括號(hào)匹配、代碼片段、代碼對(duì)比 Diff、GIT 等特性,這篇文章主要介紹了VSCode (Visual Studio Code) V1.43.0下載并設(shè)置成中文語言,需要的朋友可以參考下2020-03-03
C/C++實(shí)現(xiàn)重置文件時(shí)間戳
這篇文章主要為大家詳細(xì)介紹了C/C++實(shí)現(xiàn)重置文件時(shí)間戳的相關(guān)資料,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以參考一下2023-11-11
C++開發(fā)protobuf動(dòng)態(tài)解析工具
這篇文章主要為大家介紹了C++開發(fā)protobuf動(dòng)態(tài)解析工具實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
C語言system 自動(dòng)關(guān)機(jī)函數(shù)代碼
這篇文章主要介紹了C語言system 自動(dòng)關(guān)機(jī)函數(shù)代碼,需要的朋友可以參考下2016-04-04
基于QT實(shí)現(xiàn)自定義溫度計(jì)的示例代碼
QT原生控件沒有實(shí)現(xiàn)如儀表盤或者溫度計(jì)的控件,只好自己實(shí)現(xiàn),所以本文為大家介紹了如何利用qt實(shí)現(xiàn)自定義溫度/濕度控件,感興趣的小伙伴可以了解下2023-11-11
C語言與C++動(dòng)態(tài)通訊錄超詳細(xì)實(shí)現(xiàn)流程
這篇文章主要為大家介紹了C語言與C++動(dòng)態(tài)實(shí)現(xiàn)通訊錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-05-05

