leetcode中等题-深度优先算法(C语言)

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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一米三呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值