【LeetCode】剑指 Offer 68 - II. 二叉树的最近公共祖先 (C++ 递归)

七千22

关注

阅读 66

2022-07-14


​​题目链接​​​ 题意
求二叉树里两个节点的最近公共祖先
思路
递归求解。

如果当前节点为空,说明已经遍历到了叶子节点的下个节点,返回空。

如果当前节点等于p或q,说明当前节点就是最近公共祖先,返回root;

否则,递归求当前节点的左子树、右子树里,两者的最近公共祖先。

如果左子树的lca为空,说明两者都在右子树里,则lca为右子树的lca返回值。

否则,如果右子树的lca为空,说明两者都在左子树里,则lca为左子树的lca返回值;否则,说明两者分列root两侧,root就是lca。
代码

/**
* 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) return root;
if(root==p||root==q) return root;
TreeNode* l=lowestCommonAncestor(root->left,p,q);
TreeNode* r=lowestCommonAncestor(root->right,p,q);
if(!l){
return r;///两者都在右子树
}
else{
if(!r) return l;///两者都在左子树
return root;///分列两边
}
}
};


精彩评论(0)

0 0 举报