1.[130]被围绕的区域
解题记录:
1.这道题非常曲折,本来想用广度优先算法写写看的,想着想着就变成深度的方法了,但深度优先理解起来确实比较容易。
2.首先把矩阵最外一圈的O全部标记,再递归找到其相邻的O进行标记,标记时只需要把数组元素改成特定值即可,最后遍历输出的时候判断一下改回去。
3.这里修改数组元素的方法是参考力扣官方解答的,我本身是定义了一个同等大小的二维数组并赋初值0,然后标记的时候标记1(相关内容见注释部分)。但是不知道为啥一直有runtime error: store to null pointer of type 'int’的错误,改了半天没改出来,如果有大佬知道可以留言呜呜呜。
C语言代码:
// void dfs(char** board, int **sign, int m, int n, int row, int col){
// if (m < 0 || m >= row || n < 0 || n >= col){
// return;
// }
// else if (board[m][n] != 'O')
// return;
// sign[m][n] = 1;//被标记的O不会被修改
// //递归遍历周围元素,符合条件的标记
// dfs(board, sign, m+1, n, row, col);
// dfs(board, sign, m-1, n, row, col);
// dfs(board, sign, m, n+1, row, col);
// dfs(board, sign, m, n-1, row, col);
// }
void dfs(char** board, int m, int n, int row, int col){
if (m < 0 || m >= row || n < 0 || n >= col){
return;
}
else if (board[m][n] != 'O')
return;
board[m][n] = 'A';//被标记的O不会被修改
//递归遍历周围元素,符合条件的标记
dfs(board, m+1, n, row, col);
dfs(board, m-1, n, row, col);
dfs(board, m, n+1, row, col);
dfs(board, m, n-1, row, col);
}
void solve(char** board, int boardSize, int* boardColSize){
int i, j, row = boardSize, col = *boardColSize;
if (!row)
return;
//定义标记二维数组
// int **sign = (int**)malloc(sizeof(int*)*row);
// for (i = 0; i < row; i++)
// {
// //每一位分配空间并初始化
// sign[i] = (int*)malloc(sizeof(int)*col);
// }
// memset(sign, 0, sizeof(sign));
for (i = 0; i < row; i++)
{//遍历头尾两列
dfs(board, i, 0, row, col);
dfs(board, i, col-1, row, col);
}
for (i = 1; i < col - 1; i++)
{//遍历头尾两行(四个角不重复遍历)
dfs(board, 0, i, row, col);
dfs(board, row-1, i, row, col);
}
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
//若为O且没被保护标记,则填充为X
if (board[i][j] == 'A')
board[i][j] = 'O';
else if (board[i][j] == 'O')
board[i][j] = 'X';
}
}
}
2.[98]验证二叉搜索树
解题记录:
1.我一开始的写法是注释掉的那段,很明显WA了,因为我只判断了当前根节点和左右子树的根节点的大小,没有判断左右子树其他结点的大小。
2.修改后的代码再次利用了递归进行深度优先搜索,判断左右子树全部元素是否满足左小右大的条件,position记录是应该进行左子树遍历还是右子树遍历。
3.主函数中递归调用自身,判断左右子树是否也是排序二叉树。
C语言代码:
// bool isValidBST(struct TreeNode* root){
// //左右子树全空或空节点,返回true
// if (!root || (!root->left && !root->right))
// return true;
// //如果左子树满足条件且该节点比左子树根节点大,则满足,反之返回false
// if (!isValidBST(root->left) || ((root->left) && root->val <= root->left->val))
// return false;
// //如果右子树满足条件且该节点比右子树根节点小,则满足,反之返回false
// if (!isValidBST(root->right) || ((root->right) && root->val >= root->right->val))
// return false;
// //都满足条件的返回true
// return true;
// }
bool DFS(struct TreeNode* root, int target, int Position){
if (!root)
return true;
//根节点小于左子树节点
if (Position == 0 && root->val >= target)
return false;
//根节点大于右子树节点
if (Position == 1 && root->val <= target)
return false;
//递归遍历左/右子树所有值是否满足条件
return DFS(root->left, target, Position) && DFS(root->right, target, Position);
}
bool isValidBST(struct TreeNode* root){
//空节点,返回true
if (!root)
return true;
//左子树元素都满足比当前结点值小,右子树元素都满足比当前结点值大
if (!DFS(root->left, root->val, 0) || !DFS(root->right, root->val, 1))
return false;
//递归判断左右子树是否都满足排序二叉树的条件
if (!isValidBST(root->left) || !isValidBST(root->right))
return false;
return true;
}