【236. 二叉树的最近公共祖先】
自底向上查找,有点难度! | LeetCode:236. 二叉树的最近公共祖先_哔哩哔哩_bilibili
在一个二叉树中,查找p、q节点的最近公共祖先。
使用递归的方式。
1.递归的参数和返回值
返回值是二叉树的节点,参数就是二叉树的根节点、p和q
2.确定递归的终止条件
当根节点为空的时候,返回NULL
当根节点为p的时候,返回p
当根节点为q的时候,返回q
3.确定递归的逻辑
使用后续遍历的逻辑,左右中。因为后续遍历包含了回溯的过程
左递归:根节点的左子树为递归函数将左子树带入时候的返回值。
右递归:根节点的右子树为递归函数将右子树带入时候的返回值。
中间递归:
当根节点的左子树为空、右子树不为空的时候,返回右子树
当根节点的左子树不为空,右子树为空的时候,返回左子树
当跟节点左子树右子树都不为空的时候,返回跟节点
整体代码如下:
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == NULL)return NULL;
if(root == p)return p;
if(root == q)return q;
TreeNode* left = lowestCommonAncestor(root->left, p, q);
TreeNode* right = lowestCommonAncestor(root->right, p, q);
if(left != NULL && right == NULL)return left;
if(right != NULL && left == NULL) return right;
if(left != NULL && right != NULL)return root;
return NULL;
}
};