2
public TreeNode canMerge(List<TreeNode> trees) {3
// Map root value to tree4
HashMap<Integer, TreeNode> map = new HashMap<>();5
for (TreeNode t : trees) {10
for (TreeNode t : trees) {11
if (map.containsKey(t.val)) {16
// After merging we should have only one tree left else return null17
if (map.size() != 1) return null;19
// Return the one tree left after merging20
for (int c : map.keySet()) {21
// Check if final tree is valid else return null22
if (isValidBST(map.get(c))) {31
void merger(TreeNode t, HashMap<Integer, TreeNode> map) {33
t.val); // Remove current tree to prevent cyclical merging For. 2->3(Right) and 3->2(Left)35
if (t.left != null && map.containsKey(t.left.val)) {36
// Before merging child node, merge the grandchild nodes37
merger(map.get(t.left.val), map);38
t.left = map.get(t.left.val);39
map.remove(t.left.val);43
if (t.right != null && map.containsKey(t.right.val)) {44
// Before merging child node, merge the grandchild nodes45
merger(map.get(t.right.val), map);46
t.right = map.get(t.right.val);47
map.remove(t.right.val);49
// Add tree back to map once right and left merge is complete54
public boolean isValidBST(TreeNode root) {55
return helper(root, Long.MIN_VALUE, Long.MAX_VALUE);58
public boolean helper(TreeNode root, long min, long max) {59
if (root == null) return true;60
if (root.val <= min || root.val >= max) return false;61
return helper(root.left, min, root.val) && helper(root.right, root.val, max);