解题思路:分别用两个vector数组存入找到两节点的路径,然后比较两vector相同的元素,代码如下
//方法一:两次遍历法,借用两个vector数组
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (!root) return root;
vector<TreeNode*> pVector, qVector;
TreeNode* result;
bool flag = false;
recursion(root, p, pVector, flag);
flag = false;
recursion(root, q, qVector, flag);
while (!pVector.empty() && !qVector.empty())
{
if (pVector.back() != qVector.back()) {
break;
}
result = pVector.back();
pVector.pop_back();
qVector.pop_back();
}
return result;
}
void recursion(TreeNode*& ptr, TreeNode*& target, vector<TreeNode*>& vect, bool& flag);
};
void Solution::recursion(TreeNode*& ptr, TreeNode*& target, vector<TreeNode*>& vect, bool& flag)
{
if (!ptr) return;
if (ptr == target) {
vect.push_back(ptr);
flag = true;
return;
}
recursion(ptr->left, target, vect, flag);
if (flag) {
vect.push_back(ptr);
return;
}
recursion(ptr->right, target, vect, flag);
if (flag) {
vect.push_back(ptr);
return;
}
}
//方法二:网友答案,一次遍历法,递归用的出神入化
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* A, TreeNode* p, TreeNode* q) {
if (!A || A == p || A == q)return A;
TreeNode* left = lowestCommonAncestor(A->left, p, q);
TreeNode* right = lowestCommonAncestor(A->right, p, q);
if (left && right)return A;
if (!left && !right)return NULL;
return left ? left : right;
}
};