问题描述
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
–所有节点的值都是唯一的。
–p、q 为不同节点且均存在于给定的二叉树中。
解法(只针对一般情况)
这里只针对算法进行解析
首先要考虑特殊情况:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root==null){
return root;
}
if(root==p||root==q){
return root;
}
}
排除特殊情况以后开始对左右子树进行查找
- 左右子树的返回值都不为null, 由于值唯一左右子树的返回值就是p和q, 此时root为LCA
- 如果左右子树返回值只有一个不为null, 说明只有p和q存在与左或右子树中, 最先找到的那个节点为LCA
- 左右子树返回值均为null, p和q均不在树中, 返回null
struct TreeNode *left,*right;
left = lowestCommonAncestor(root->left, p, q);
right = lowestCommonAncestor(root->right, p, q);
if (left && right) {
return root;
} else if (left != NULL) {
return left;
} else if (right != NULL) {
return right;
}
return NULL;