力扣網 | 每日打卡題 | 103. 二叉樹的鋸齒形層序遍歷
阿新 • • 發佈:2020-12-27
文章目錄
題目
103. 二叉樹的鋸齒形層序遍歷 - 力扣(LeetCode)
解析
層次遍歷——翻轉記錄陣列
- 用levelsize記錄每層的節點數;
- 用vtmp正常遍歷順序記錄每層節點;
- 用flag記錄單雙層,用於翻轉vtmp;
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
//[1,2,3,4,null,null,5]
//[3,9,20,null,null,15,7]
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int>> res;
if(root==nullptr)return res;
queue<TreeNode*> q;
q.push(root);
int levelsize= q.size();//記錄當前層的節點數量
int flag=false;
while(!q.empty()){
//遍歷當前層所有節點
vector<int> vtmp;
while(levelsize--){
TreeNode* ttmp=q.front();
q.pop();
vtmp.push_back(ttmp->val);
if(ttmp-> left!=nullptr)q.push(ttmp->left);
if(ttmp->right!=nullptr)q.push(ttmp->right);
}
if(flag)reverse(vtmp.begin(),vtmp.end());
res.push_back(vtmp);
flag=~flag;
levelsize=q.size();
}
return res;
}
};
官方解答——雙向佇列deque
- 用isOrderLeft記錄單雙層
- 通過isOrderLeft判斷節點新增到levelList的左邊還是右邊
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int>> ans;
if (!root) {
return ans;
}
queue<TreeNode*> nodeQueue;
nodeQueue.push(root);
bool isOrderLeft = true;
while (!nodeQueue.empty()) {
deque<int> levelList;
int size = nodeQueue.size();
for (int i = 0; i < size; ++i) {
auto node = nodeQueue.front();
nodeQueue.pop();
if (isOrderLeft) {
levelList.push_back(node->val);
} else {
levelList.push_front(node->val);
}
if (node->left) {
nodeQueue.push(node->left);
}
if (node->right) {
nodeQueue.push(node->right);
}
}
ans.emplace_back(vector<int>{levelList.begin(), levelList.end()});
isOrderLeft = !isOrderLeft;
}
return ans;
}
};
/*
作者:LeetCode-Solution
連結:https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal/solution/er-cha-shu-de-ju-chi-xing-ceng-xu-bian-l-qsun/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
*/