M1123.最深叶节点的最近公共祖先
dfs, https://leetcode.cn/problems/lowest-common-ancestor-of-deepest-leaves/
思路:如果直接想还挺难,但是如果考虑到二叉树的通用递归思路,那么就可以有很好的解决方法,即利用递归的思路
如果左子树更深,最深叶节点在左子树中,我们返回 {左子树深度 + 1,左子树的 lca 节点} 如果右子树更深,最深叶节点在右子树中,我们返回 {右子树深度 + 1,右子树的 lca 节点} 如果左右子树一样深,左右子树都有最深叶节点,我们返回
cpp
class Solution {
public:
pair<TreeNode*, int> f(TreeNode* root) {
if (!root) {
return {root, 0};
}
auto left = f(root->left);
auto right = f(root->right);
if (left.second > right.second) {
return {left.first, left.second + 1};
}
if (left.second < right.second) {
return {right.first, right.second + 1};
}
return {root, left.second + 1};
}
TreeNode* lcaDeepestLeaves(TreeNode* root) {
return f(root).first;
}
};