题解 | #在二叉树中找到两个节点的最近公共祖先#
在二叉树中找到两个节点的最近公共祖先
https://www.nowcoder.com/practice/e0cc33a83afe4530bcec46eba3325116
/** * 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; } };
使用后续遍历的思想:
- 遍历到目标结点就停,得到根节点到目标节点的路径
- 从后向前遍历路径,当遇到两个不相等的节点后退出
- 推出后得到最近的公共祖先节点