【剑指offer】【树】68-II.二叉树的最近公共祖先
题目链接:https://leetcode-cn.com/problems/er-cha-shu-de-zui-jin-gong-gong-zu-xian-lcof/
找两个节点的最低公共祖先,递归去找
1. 第一种情况,左右子树都有p和q,当前节点为他们的公共祖先
2. 第二种情况,左子树有或者右子树有,公共节点为对应的公共祖先
3. 特殊情况:其中一个节点与根节点相同,最低公共祖先为根节点
时间复杂度和空间复杂度都是O(N)
其中 N 为二叉树节点数;最差情况下,需要递归遍历树的所有节点。
最差情况下,递归深度达到 N ,系统使用 O(N) 大小的额外空间。
递归
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
//递归终止条件
if(!root || root == p||root == q) return root;
//判断左边有没有p和q两个点
TreeNode* left = lowestCommonAncestor(root->left, p, q);
//判断右边有没有p和q两个点
TreeNode* right = lowestCommonAncestor(root->right, p, q);
//p和q在左右两边都有,当前这个点就是左右节点的公共祖先
if(left && right) return root;
// 只有一个非空则返回该指针,两个都为空则返回空指针
return left ? left : right;
}
};
知识的价值不在于占有,而在于使用

浙公网安备 33010602011771号