https://lintcode.com/problem/lowest-common-ancestor-of-a-binary-tree/description
描述
中文English
给定一棵二叉树,找到两个节点的最近公共父节点(LCA)。
最近公共祖先是两个节点的公共的祖先节点且具有最大深度。
假设给出的两个节点都在树中存在
您在真实的面试中是否遇到过这个题? 是
题目纠错
样例
样例 1:
输入:{1},1,1
输出:1
解释:
二叉树如下(只有一个节点):
1
LCA(1,1) = 1
样例 2:
输入:{4,3,7,#,#,5,6},3,5
输出:4
解释:
二叉树如下:
4
/ \
3 7
/ \
5 6
LCA(3, 5) = 4
这才几天没刷题啊。。。
LCA都想不出
思路:dfs查找
找左子树是否满足这两个点某一个在,右子树是否满足这两个点某一个在
要是分别在,那么当前点是LCA
要是都在一侧,那么返回那个节点
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/*
* @param root: The root of the binary search tree.
* @param A: A TreeNode in a Binary.
* @param B: A TreeNode in a Binary.
* @return: Return the least common ancestor(LCA) of the two nodes.
*/
TreeNode * lowestCommonAncestor(TreeNode * root, TreeNode * A, TreeNode * B) {
// write your code here
if (root == NULL || root == A || root == B) {
return root;
}
TreeNode* left = lowestCommonAncestor(root->left, A, B);
TreeNode* right = lowestCommonAncestor(root->right, A, B);
if (left && right)
return root;
return left?left:right;
}
};