题目描述:
Given a rooted binary tree, return the lowest common ancestor of its deepest leaves.
Recall that:
- The node of a binary tree is a leaf if and only if it has no children
- The depth of the root of the tree is 0, and if the depth of a node is
d
, the depth of each of its children isd+1
. - The lowest common ancestor of a set
S
of nodes is the nodeA
with the largest depth such that every node in S is in the subtree with rootA
.
Example 1:
Input: root = [1,2,3] Output: [1,2,3] Explanation: The deepest leaves are the nodes with values 2 and 3. The lowest common ancestor of these leaves is the node with value 1. The answer returned is a TreeNode object (not an array) with serialization "[1,2,3]".
Example 2:
Input: root = [1,2,3,4] Output: [4]
Example 3:
Input: root = [1,2,3,4,5] Output: [2,4,5]
Constraints:
- The given tree will have between 1 and 1000 nodes.
- Each node of the tree will have a distinct value between 1 and 1000.
class Solution {
public:
TreeNode* lcaDeepestLeaves(TreeNode* root) {
if(root==NULL) return NULL;
height=0, num=0;
postorder(root,1,height,num);
TreeNode* result=NULL;
int max_height=0;
num_of_deepest_leaves(root,1,result,max_height);
return result;
}
int num_of_deepest_leaves(TreeNode* cur, int cur_height, TreeNode*& result, int& max_height)
{ // 计算当前节点下的最深节点个数
if(cur==NULL) return 0;
int cur_num=cur_height==height?1:0;
int left=num_of_deepest_leaves(cur->left,cur_height+1,result,max_height);
int right=num_of_deepest_leaves(cur->right,cur_height+1,result,max_height);
if(cur_num==num||left+right==num)
{
if(cur_height>max_height) // 最低的公共祖先必然满足高度最大,同时包含所有最深叶节点
{
result=cur;
max_height=cur_height;
}
}
return cur_num+left+right;
}
void postorder(TreeNode* node, int cur_height, int& height, int& num)
{ // 后序遍历得到最深叶节点个数和树的高度
if(node==NULL) return;
postorder(node->left,cur_height+1,height,num);
postorder(node->right,cur_height+1,height,num);
if(cur_height>height)
{
num=1;
height=cur_height;
}
else if(cur_height==height) num++;
}
private:
int height; // 树的高度
int num; // 最深叶节点个数
};