class Solution {
public:
stack<TreeNode *> postOrderSearch(TreeNode *root,TreeNode *p){
stack<TreeNode *> res;
stack<TreeNode *>s;
if(root==NULL){
return res;
}
TreeNode *pre=root;
s.push(root);
while(!s.empty()&&s.top()!=p){
TreeNode *tmp=s.top();
if(tmp->left==pre||tmp->right==pre){
res.push(tmp);
s.pop();
pre=tmp;
continue;
}
if(tmp->right!=NULL){
s.push(tmp->right);
}
if(tmp->left!=NULL){
s.push(tmp->left);
}
if(tmp->left==NULL&&tmp->right==NULL){
pre=tmp;
s.pop();
}
}
pre=s.top()->left;
while(!s.empty()){
if(s.top()->left==pre||s.top()->right==pre){
res.push(s.top());
pre=s.top();
}
s.pop();
}
return res;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
stack<TreeNode *> res1=postOrderSearch(root,p),res2=postOrderSearch(root,q);
TreeNode *pre=root;
while(!res1.empty()&&!res2.empty()){
if(res1.top()==res2.top()){
pre=res1.top();
res1.pop(),res2.pop();
}
else{
break;
}
}
return pre;
}
};