/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
void postOrderTravesal(TreeNode* root, vector<int>& Ancestor, int o) {
stack<TreeNode*> s;
TreeNode* p = root;
TreeNode* r; // 标记最近访问过的结点
while (p != nullptr || !s.empty()) {
// 一直向左
if (p != nullptr) {
s.push(p);
p = p->left;
} else {
// 获取栈顶结点
p = s.top();
// 如果右子树存在且未被访问
if (p->right && p->right != r) {
p = p->right;
s.push(p);
p = p->left;
} else {
// 若右子树不存在或者右子树被访问过了
// 访问当前结点
if (p->val == o) {
break;
}
s.pop();
r = p;
p = nullptr;
}
}
}
while (!s.empty()) {
TreeNode* temp = s.top();
s.pop();
Ancestor.push_back(temp->val);
}
}
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @param o1 int整型
* @param o2 int整型
* @return int整型
*/
int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
// write code here
vector<int> a1, a2;
int res;
postOrderTravesal(root, a1, o1);
postOrderTravesal(root, a2, o2);
int len1 = a1.size(), len2 = a2.size();
while (a1[len1-1] == a2[len2-1]) {
len1--;
len2--;
}
res = a1[len1];
return res;
}
};
使用后续遍历的思想:
- 遍历到目标结点就停,得到根节点到目标节点的路径
- 从后向前遍历路径,当遇到两个不相等的节点后退出
- 推出后得到最近的公共祖先节点

京公网安备 11010502036488号