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;
}
};思路:dfs 返回左右子树的最大深度和 lca , 选取深度最大的子树及其 lca, 如果深度相等, 则说明当前节点是 lca
cpp
class Solution {
public:
TreeNode* lcaDeepestLeaves(TreeNode* root) {
return dfs(root).first;
}
pair<TreeNode*, int> dfs(TreeNode* root) {
if (!root) return {nullptr, 0};
auto [left_lca, left_depth] = dfs(root->left);
auto [right_lca, right_depth] = dfs(root->right);
if (left_depth < right_depth) {
return {right_lca, right_depth + 1};
} else if (left_depth > right_depth) {
return {left_lca, left_depth + 1};
} else {
return {root, left_depth + 1};
}
}
};