解题思路:想法当然是从下往上记,如果碰到了就返回,那么很明显就要用后序遍历来做,递归三部曲:确定函数返回值已经参数,确定终止条件,确定单层递归的逻辑。(还是有些困惑)
具体代码如下:
class Solution {
public:
TreeNode*travel(TreeNode* root, TreeNode* p, TreeNode* q){
if(root==NULL)return NULL;
if(root==p||root==q)return root;//终止条件
TreeNode*Left=travel(root->left,p,q);
TreeNode*Right=travel(root->right,p,q);
if(Left!=NULL&&Right!=NULL)return root;
if(Left!=NULL&&Right==NULL)return Left;
else if(Left==NULL&&Right!=NULL)return Right;
else return NULL;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
TreeNode*result=travel(root,p,q);
return result;
}
};
具体题目如下:
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”