一、问题描述(236. 二叉树的最近公共祖先)
二、AC代码如下(解释见注释)
关键:
①精确定义什么是祖先,什么是最近公共祖先(描述清楚问题是解决问题的第一步)
②由于需要从下往上遍历,自然选择后序遍历
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
//后序遍历的思想(递归实现)
//递归边界
if(root == NULL || root == p || root == q) return root; //root == NUL向其父结点说明自己不是p、q的最近公共祖先;root = p向其父结点说明自己是p的最近祖先;root = q向其父结点说明自己是q的最近祖先;
//递归式
//左子树
TreeNode* left = lowestCommonAncestor(root->left, p, q);
//右子树
TreeNode* right = lowestCommonAncestor(root->right, p, q);
//根节点
if(left == NULL) return right; //向父结点传递右孩子的信息
if(right == NULL) return left; //向父结点传递左孩子的信息
return root; //p、q各自的最近祖先在父结点的异侧
}
};
三、运行结果
四、大佬解析
236. 二叉树的最近公共祖先(后序遍历 DFS ,清晰图解)