{ return root; }
TreeNode* fromLeft = lowestCommonAncestor(root -> left, p, q);
TreeNode* fromRight = lowestCommonAncestor(root -> right, p, q);
if (!fromLeft)
{ return fromRight; }
if (fromRight)
{ return root; }
return fromLeft;
(非递归):
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q)
{ // special cases
if(root == NULL)
return NULL;
if(p == root || q == root)
return root;
if(p == q) return p;
vector<TreeNode*> vp;
vector<TreeNode*> vq;
stack<TreeNode*> stk;
unordered_map<TreeNode*, bool> m;//visited
stk.push(root);
m[root] = true;
while(!stk.empty())
{
TreeNode* top = stk.top();
if(top->left && m[top->left] == false)
{
stk.push(top->left);
m[top->left] = true;
if(top->left == p)
{
vp = stkTovec(stk);
if(!vq.empty()) break;
}
if(top->left == q)
{
vq = stkTovec(stk);
if(!vp.empty()) break;
}
continue;
}
if(top->right && m[top->right] == false)
{ stk.push(top->right);
m[top->right] = true;
if(top->right == p)
{ vp = stkTovec(stk);
if(!vq.empty()) break;
} if(top->right == q)
{ vq = stkTovec(stk);
if(!vp.empty()) break;
}
continue;
}
stk.pop();
}
int i = 0;
for(; i < vp.size() && i < vq.size(); i ++)
{
if(vp[i] != vq[i]) break;
}
return vp[i-1]; }
vector<TreeNode*> stkTovec(stack<TreeNode*> stk)
{
vector<TreeNode*> v;
while(!stk.empty())
{ TreeNode* top = stk.top();
stk.pop();
v.push_back(top);
}
reverse(v.begin(), v.end());
return v;
}