1. 程式人生 > 其它 >力扣網 | 每日打卡題 | 103. 二叉樹的鋸齒形層序遍歷

力扣網 | 每日打卡題 | 103. 二叉樹的鋸齒形層序遍歷

技術標籤:刷題# 力扣佇列二叉樹leetcode演算法

文章目錄

題目

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)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
*/