问题
寻找p和q的最近公共祖先
思路
用栈对二叉树后序遍历,遍历时栈有如下特性:
栈中的节点都是当前遍历节点的祖先,(最近的祖先是最近被弹出的节点)。
基于这个性质,在遍历的时候如果p和q都已经遍历过了,则她们的共同祖先就是最近被弹出栈的那个节点。
struct Node {
int data{0};
Node *l{nullptr};
Node *r{nullptr};
}
Node* solve(Node *root,Node *p1,Node *p2){
int cnt = 0; // 找到的节点的总数
stack<Node*> s;
Node *p = root; Node *res = nullptr;
while (cnt < 2){
if (p == nullptr) p = s.top()->l, res = s.top(), s.pop();
else cnt += (p == p1 || p == p2) ? 1 : 0 , s.push(p), p = p->r;
}
return res;
}