leetcode --103、130

103. 二叉樹的鋸齒形層次遍歷

題目描述

給定一個二叉樹,返回其節點值的鋸齒形層次遍歷。(即先從左往右,再從右往左進行下一層遍歷,以此類推,層與層之間交替進行)。

例如:
給定二叉樹 [3,9,20,null,null,15,7],
在這裏插入圖片描述

解題方法

隊列,每層後面加一個NULL。

class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        vector<vector <int>> res;
        if (root == NULL)   return res;
        queue<TreeNode *>  q;
        q.push(root);   q.push(NULL);
        vector<int > v;
        bool flag = true;

        while ( !q.empty())
        {
            TreeNode * cur = q.front();     // 當前結點
            q.pop();
            if (cur != NULL)
            {
                v.push_back(cur->val);
                if (cur->left != NULL)  q.push(cur->left);
                if (cur->right != NULL) q.push(cur->right);
            }
            if (cur == NULL)                // 等於NULL,說明到了末尾
            {
                if (flag == true)
                    flag = false;
                else
                {
                    reverse(v.begin(), v.end());
                    flag = true;
                }
                res.push_back(v);
                q.push(NULL);   
                if (q.front() == NULL) // 如果是最後一層,如果還加NULL,那麼會進入死循環
                    break;
                v.clear();      // 清零
            }
        }
        return res;
    }
};

130. 被圍繞的區域

題目描述

給定一個二維的矩陣,包含 ‘X’ 和 ‘O’(字母 O)。

找到所有被 ‘X’ 圍繞的區域,並將這些區域裏所有的 ‘O’ 用 ‘X’ 填充。

示例:

X X X X
X O O X
X X O X
X O X X
運行你的函數後,矩陣變爲:

X X X X
X X X X
X X X X
X O X X
解釋:

被圍繞的區間不會存在於邊界上,換句話說,任何邊界上的 ‘O’ 都不會被填充爲 ‘X’。 任何不在邊界上,或不與邊界上的 ‘O’ 相連的 ‘O’ 最終都會被填充爲 ‘X’。如果兩個元素在水平或垂直方向相鄰,則稱它們是“相連”的。

解題方法

BFS,先將邊界上爲’O’的入隊,並且將對應位置改變,目的是爲了防止連通情況進入死循環,之後對每個隊列元素BFS,同樣需要改變對應位置元素。

連通情況指的是:
OOOO
OOOO
OOOO
OOOO


class Solution {
public:
    void solve(vector<vector<char>>& board) 
    {
        if(board.empty()) return;
        int m = board.size(), n = board[0].size();
        vector<vector<char>> res;
        for (int i = 0; i < m; i ++)            // 初始化 res
        {
            vector<char> c(n, 'X');
            res.push_back(c);
        }

        queue<pair<int, int>> q;
        for (int i = 0; i < m ; i ++)           // board的邊界入隊
        {
            if (board[i][0] == 'O')
            {
                q.push({i, 0});
                board[i][0] = 'a';
            }
            if (board[i][n-1] == 'O')
            {
                q.push({i, n-1});
                board[i][n-1] = 'a';
            }
                
        }

        for (int j = 0; j < n; j++ )
        {
            if (board[0][j] == 'O')
            {
                q.push({0, j});
                board[0][j] = 'a';
            }
                
            if (board[m-1][j] == 'O')
            {
                q.push({m-1, j});
                board[m-1][j] = 'a';
            }
        }
        
        int x_near[4] = {-1, 1, 0, 0};
        int y_near[4] = {0, 0, -1, 1};

        while (!q.empty())
        {
            pair<int, int> p = q.front();
            q.pop();
            res[p.first][p.second] = 'O';

            for (int c = 0; c < 4; c ++)
            {
                int xx = p.first + x_near[c];
                int yy = p.second + y_near[c];
                if (xx < 0 || xx >= m || yy < 0 || yy >= n || board[xx][yy] != 'O')
                    continue;
                q.push({xx, yy});
                board[xx][yy] = 'a';
            }
        }
        board = res;
    }
};

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