1. 二叉查找树
/**
* 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 == NULL) return NULL;
if(root->val < min(p->val,q->val)) return lowestCommonAncestor(root->right, p, q);
else if (root->val > max(p->val,q->val)) return lowestCommonAncestor(root->left, p, q);
else return root;
}
};
2. 普通二叉树
/**
* 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) {
TreeNode *left, *right;
if(!root || root==p || root==q) return root;
left = lowestCommonAncestor(root->left,p,q);
right = lowestCommonAncestor(root->right,p,q);
if(left && right) return root; //两边子树各有一个结点
return left ? left : right;
}
};
3. 普通树:含指向父节点的指针
转化为求两个输入结点所在链表(pParent链接)的第一个公共结点。
《剑指offer》52--两个链表的第一个公共结点[C++]
4. 普通树:不含指向父节点的指针
先用DFS遍历求两个输入结点所在路径链表,进而求两个链表的最后一个公共结点。复杂度为O(n)+O(logn)(平均)。
|