236. 二叉树的最近公共祖先
题目描述:
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
示例 1:
输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点 5 和节点 1 的最近公共祖先是节点 3 。
示例 2:
输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出:5
解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。
思路分析:
首先我们确定遍历顺序 ,本题我们使用后续遍历,
简单的想法,如果我们遇到了遍历到节点 == p || == q ,我们就往上进行返回。
如果左子树遍历的节点 == 7 ,那么将 7 进行返回。
相同如果右子树遍历到的节点 ==4 ,那么将 4 进行返回。
如果不存在 与目标值相等节点,那么向上返回 nullptr。
中间的处理逻辑:
对左子树 和 右子树的返回值进行判断。
if( left && right ) return root; //分别在左右指数找到了对于的值
if(!left && right ) return right; //左子树没有找到 ,但是在右子树找到了
if(!right && left ) return left;
你可以会想还有一个情况。
其实是包含在我们上面的情况的 ,因为只要我们遇到 2 了 ,就往上返回了。
具体的代码实现:
class Solution {
public:
//后续遍历
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(!root) return NULL;
if(root == p || root== q ) return root; //如果遇到p 或者 q 我们就往上进行返回
TreeNode *left = lowestCommonAncestor(root->left ,p ,q);
TreeNode *right = lowestCommonAncestor(root->right ,p ,q);
//中间处理逻辑
if( left && right ) return root;
if(!left && right ) return right;
if(!right && left ) return left;
return NULL;
}
};