📝

Leetcode 1123

Importance
📗📗📗📗
Start Date
Apr 4, 2025 12:12
tags
Tree
Link:
1123. 最深叶节点的最近公共祖先 - 力扣(LeetCode)
1123. 最深叶节点的最近公共祖先 - 给你一个有根节点 root 的二叉树,返回它 最深的叶节点的最近公共祖先 。 回想一下: * 叶节点 是二叉树中没有子节点的节点 * 树的根节点的 深度 为 0,如果某一节点的深度为 d,那它的子节点的深度就是 d+1 * 如果我们假定 A 是一组节点 S 的 最近公共祖先,S 中的每个节点都在以 A 为根节点的子树中,且 A 的深度达到此条件下可能的最大值。   示例 1: [https://s3-lc-upload.s3.amazonaws.com/uploads/2018/07/01/sketch1.png] 输入:root = [3,5,1,6,2,0,8,null,null,7,4] 输出:[2,7,4] 解释:我们返回值为 2 的节点,在图中用黄色标记。 在图中用蓝色标记的是树的最深的节点。 注意,节点 6、0 和 8 也是叶节点,但是它们的深度是 2 ,而节点 7 和 4 的深度是 3 。 示例 2: 输入:root = [1] 输出:[1] 解释:根节点是树中最深的节点,它是它本身的最近公共祖先。 示例 3: 输入:root = [0,1,3,null,2] 输出:[2] 解释:树中最深的叶节点是 2 ,最近公共祖先是它自己。   提示: * 树中的节点数将在 [1, 1000] 的范围内。 * 0 <= Node.val <= 1000 * 每个节点的值都是 独一无二 的。   注意:本题与力扣 865 重复:https://leetcode-cn.com/problems/smallest-subtree-with-all-the-deepest-nodes/ [https://leetcode-cn.com/problems/smallest-subtree-with-all-the-deepest-nodes/]
1123. 最深叶节点的最近公共祖先 - 力扣(LeetCode)

题目要求

给你一个有根节点 root 的二叉树,返回它 最深的叶节点的最近公共祖先 。
回想一下:
  • 叶节点 是二叉树中没有子节点的节点
  • 树的根节点的 深度 为 0,如果某一节点的深度为 d,那它的子节点的深度就是 d+1
  • 如果我们假定 A 是一组节点 S 的 最近公共祖先S 中的每个节点都在以 A 为根节点的子树中,且 A 的深度达到此条件下可能的最大值。
 

核心算法和原理

  • 这次需要找到最深节点的LCA,那么可以在返回值多记录一个「最深节点深度」
  • 遍历时,为null返回null,否则dfs左右子树
  • 如果dfs结果都不为null则检查左右子树的深度,相等则返回(node, 左右子树的深度) ,否则返回深度较大的那边的dfs结果
  • 其余情况看代码,一目了然
 

代码

/** * 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: typedef pair<TreeNode*, int> pit; TreeNode* lcaDeepestLeaves(TreeNode* root) { auto dfs = [&](this auto&& dfs, TreeNode* node, int depth) -> pit { if (node == nullptr) { return make_pair(nullptr, depth); } pit l = dfs(node->left, depth + 1); pit r = dfs(node->right, depth + 1); if (l.first && r.first) { if (l.second > r.second) { return l; } else if (l.second < r.second) { return r; } else { // 两边子树高度深度相同,说明node就是「以node为根的树中符合要求 // 的LCA」 return make_pair(node, l.second); } } else if (l.first) { return l; } else if (r.first) { return r; } else { // 都为nullptr:说明node是叶子节点,返回node即可 return make_pair(node, depth); } }; return dfs(root, 0).first; } };