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;
}
};