# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', nodes: List['TreeNode']) -> 'TreeNode':
nodes_set = set(nodes)
def dfs(node):
if not node:
return None
if node in nodes_set:
return node
left = dfs(node.left)
right = dfs(node.right)
if left and right:
return node
return left or right
return dfs(root)
// Definition for a binary tree node.
// struct TreeNode {
// int val;
// TreeNode *left;
// TreeNode *right;
// TreeNode() : val(0), left(nullptr), right(nullptr) {}
// TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
// TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
// };
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, vector<TreeNode*>& nodes) {
unordered_set<TreeNode*> nodeSet(nodes.begin(), nodes.end());
return dfs(root, nodeSet);
}
TreeNode* dfs(TreeNode* node, unordered_set<TreeNode*>& nodeSet) {
if (!node) return nullptr;
if (nodeSet.count(node)) return node;
TreeNode* left = dfs(node->left, nodeSet);
TreeNode* right = dfs(node->right, nodeSet);
if (left && right) return node;
return left ? left : right;
}
};
// Definition for a binary tree node.
// public class TreeNode {
// int val;
// TreeNode left;
// TreeNode right;
// TreeNode() {}
// TreeNode(int val) { this.val = val; }
// TreeNode(int val, TreeNode left, TreeNode right) {
// this.val = val;
// this.left = left;
// this.right = right;
// }
// }
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, List<TreeNode> nodes) {
Set<TreeNode> nodeSet = new HashSet<>(nodes);
return dfs(root, nodeSet);
}
private TreeNode dfs(TreeNode node, Set<TreeNode> nodeSet) {
if (node == null) return null;
if (nodeSet.contains(node)) return node;
TreeNode left = dfs(node.left, nodeSet);
TreeNode right = dfs(node.right, nodeSet);
if (left != null && right != null) return node;
return left != null ? left : right;
}
}
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @param {TreeNode[]} nodes
* @return {TreeNode}
*/
var lowestCommonAncestor = function(root, nodes) {
let nodeSet = new Set(nodes);
function dfs(node) {
if (!node) return null;
if (nodeSet.has(node)) return node;
let left = dfs(node.left);
let right = dfs(node.right);
if (left && right) return node;
return left || right;
}
return dfs(root);
};
nodes
(each a reference to a node in the tree), find the lowest common ancestor (LCA) of all the nodes in the list.
The lowest common ancestor of a set of nodes is the lowest node in the tree that has all the nodes in the set as descendants (where a node can be a descendant of itself).
nodes
list; each is a distinct reference.root
is the root of the given binary tree.nodes
is a list of TreeNode
references (not just values).nodes
list into a set for quick lookup.3 / \ 5 1 / \ / \ 6 2 0 8 / \ 7 4Let
nodes = [5, 1, 4]
.