LeetCode103. Binary Tree Zigzag Level Order Traversal題解

1. 題目描述

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).

2. 樣例

Given binary tree [3,9,20,null,null,15,7],
這裏寫圖片描述
return its zigzag level order traversal as:
這裏寫圖片描述

3. 分析

題目的意思是:層次遍歷一棵二叉樹,然後把每一層的節點存進一個vector裏面,將每一層的vector存進一個大的vector裏面,最終返回。其中每一層的vector有這樣的要求:需要進行折線形存儲,即上一層是從左至右存儲節點元素,則下一層是從右至左存儲節點元素。
最近博客更新的幾篇題解都是講解樹的層次遍歷的各種變形的,這次也不例外,無非是存儲的時候玩了點花樣。
思路也比較好想:仍然用隊列FIFO進行層次遍歷,訪問整棵樹,每一層用一個局部vector變量everyLevel存儲每一層的節點數值,只不過每到新的一層,進行判斷:如果當前層數是偶數(根節點設爲第0層),那麼說明上一層數是奇數,需要將everyLevel進行逆置操作。判斷新的一層的算法也用的輕車熟路:設置兩個變量current_levellast_level一起遍歷,當前者大於後者時,說明到了新的一層。
這裏寫圖片描述

4. 源碼

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int> > zigzagLevelOrder(TreeNode* root) {
        vector<vector<int> >result;
        vector<int> everyLevel;
        queue<TreeNode*>node;
        queue<int>level;
        int current_level = 0;
        int last_level = 0;
        TreeNode *current_node = root;
        if (root != NULL) {
            node.push(current_node);
            level.push(current_level);
            while(!node.empty()) {
                current_level = level.front();
                current_node = node.front();
                level.pop();
                node.pop();
                if (current_level > last_level) {
                    last_level = current_level;
                    if (current_level % 2 == 0) {
                        reverse(everyLevel.begin(), everyLevel.end());
                    }
                    result.push_back(everyLevel);
                    everyLevel.clear();
                    everyLevel.push_back(current_node->val);
                }
                else {
                    everyLevel.push_back(current_node->val);
                }
                if (current_node->left != NULL) {
                    node.push(current_node->left);
                    level.push(current_level+1);
                }
                if (current_node->right != NULL) {
                    node.push(current_node->right);
                    level.push(current_level+1);
                }
            }
            if (current_level % 2 != 0) {
                reverse(everyLevel.begin(), everyLevel.end());
            }
            result.push_back(everyLevel);
        }
        return result;
    }
};

5. 心得

剛開始第一提交錯誤,卡在了第27個測試樣例上面:
這裏寫圖片描述
原因是這樣的,我沒有考慮邊界情況。在我的算法中:我是判斷current_level爲偶數,說明上一層是奇數,進行逆轉,從而再將其加入result裏面。
然而只有2層的二叉樹,根節點爲0層,第1層的情況來不及在判斷條件裏面執行,程序就會跳出循環,造成只有2層的二叉樹沒有執行1層的逆序操作,所以我在最後面補了一個判斷條件以及相應的逆序操作,才通過了測試。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章