/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    int maxDepth(TreeNode* root) {
        int ans = 0;
        auto dfs = [&](auto&& dfs, TreeNode* node, int depth) -> void {
            if (!node) return;
            depth++;
            ans = max(depth, ans);
            dfs(dfs, node->left, depth);
            dfs(dfs, node->right, depth);
        };
        dfs(dfs, root, 0);
        return ans;
    }
};