递归+分类讨论
从样例中发现,我们要遍历到最下面的节点,为了判断深度,需要知道下面节点的深度,还得返回下面节点的父节点,所以我们遍历的时候需要携带深度和最深节点的父节点
对于某个节点p来说,左子树是l,右子树是r
- 若p为空,则深度为0
- 若l深度和r深度一样,返回当前节点p,深度返回任意一个+1
- 若l深度>r深度,返回左边答案,深度返回l深度+1
- 若l深度<r深度,返回右边答案,深度返回r深度+1
AC代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
pair<TreeNode*, int> dfs(TreeNode* root) {
if (!root) return {nullptr, 0};
auto l = dfs(root->left), r = dfs(root->right);
if (l.second == r.second) return {root, l.second + 1};
if (l.second > r.second) return {l.first, l.second + 1};
return {r.first, r.second + 1};
}
TreeNode* subtreeWithAllDeepest(TreeNode* root) {
return dfs(root).first;
}
};