🔗 leetcode.cn/problems/lo…
题目
思路
- 遍历二叉树,记录节点的 height 和 father
- 先让 p 和 q 的 height 保持一致,随后同步找 father,直到碰到相等的节点,即为最近的公共祖先
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val
* TreeNode *left
* TreeNode *right
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* }
*/
class Solution {
public:
unordered_map<TreeNode*, TreeNode*> fa_mp
unordered_map<TreeNode*, int> height_mp
void build(TreeNode* node) {
if (node == nullptr) return
int height = height_mp[node]
if (node->left) {
height_mp[node->left] = height + 1
fa_mp[node->left] = node
build(node->left)
}
if (node->right) {
height_mp[node->right] = height + 1
fa_mp[node->right] = node
build(node->right)
}
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
fa_mp[root] = nullptr
height_mp[root] = 0
build(root)
while (height_mp[p] < height_mp[q]) {
q = fa_mp[q]
}
while (height_mp[p] > height_mp[q]) {
p = fa_mp[p]
}
while (p != q) {
p = fa_mp[p]
q = fa_mp[q]
}
return p
}
}