235很简单,因为二叉搜索树的特性,如果一左一右则就是当前节点。 如果都左或者都右,则顺着递归往下走即可
236普通的二叉树。
法一:dfs遍历整棵树,记录所有的节点的父节点是什么。 之后root1开始放上遍历,vis记录经过的所有节点。之后root2开始遍历,碰到vis=1的即最近的父节点。
法二:dfs往下找这两个节点。往左找A和B找到没(||一个即可),往右找找到没。如果左右都有即当前为公共,否则返回左/右。
class Solution {
public:
unordered_map<int, TreeNode*> fa;
unordered_map<int, bool> vis;
void dfs(TreeNode* root){
if (root->left != nullptr) {
fa[root->left->val] = root;
dfs(root->left);
}
if (root->right != nullptr) {
fa[root->right->val] = root;
dfs(root->right);
}
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
fa[root->val] = nullptr;
dfs(root);
while (p != nullptr) {
vis[p->val] = true;
p = fa[p->val];
}
while (q != nullptr) {
if (vis[q->val]) return q;
q = fa[q->val];
}
return nullptr;
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/solution/er-cha-shu-de-zui-jin-gong-gong-zu-xian-by-leetc-2/