
解法:递归
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
struct TreeNode* lowestCommonAncestor(struct TreeNode* root, struct TreeNode* p, struct TreeNode* q){
// 1,递归边界:
// 1.1走到底都没找到就返回NULL,代表false
if(!root) return NULL;
// 1.2如果在递归过程中找到了其中任意一个,就返回该节点root,代表true
else if(root->val == p->val || root->val == q->val) return root;
// 1.3如果在遍历过程中没找到就继续找:在左右子树中递归查找
// 2. 分解:在左右子树中查找
// 2.1 在左子树中查找其中任意一个节点的最近公共祖先
struct TreeNode* left = lowestCommonAncestor(root->left, p, q);
// 2.1 在右子树中查找其中任意一个节点的最近公共祖先
struct TreeNode* right = lowestCommonAncestor(root->right, p, q);
// 3. 判断
/*
if(!right) return left;
if(!left) return right;
return root;
*/
// 3.1 p和q在不同的子树中,root是其最小祖先
if(left && right) return root;
// 3.2 p和q是祖孙关系,同时位于root的其中一个子树中
if(left && !right) return left; //都位于左子树
if(right && !left) return right;//都位于右子树
// 3.3 p和q不在该节点的路径中
return NULL;
}

212

被折叠的 条评论
为什么被折叠?



