###### tags: `LeetCode Study Group - Tree` `LeetCode Medium` `LeetCode Study Group` `Prep Again` # 1305. All Elements in Two Binary Search Trees Link: https://leetcode.com/problems/all-elements-in-two-binary-search-trees/description/ Given two binary search trees root1 and root2, return a list containing all the integers from both trees sorted in ascending order. Example 1: ``` Input: root1 = [2,1,4], root2 = [1,0,3] Output: [0,1,1,2,3,4] ``` Example 2: ``` Input: root1 = [1,null,8], root2 = [8,1] Output: [1,1,8,8] ``` Constraints: ``` The number of nodes in each tree is in the range [0, 5000]. -105 <= Node.val <= 105 ``` ## Solution-1 Time complexity: O(nlog n) Space complexity: O(n) ```java /** * 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 List<Integer> getAllElements(TreeNode root1, TreeNode root2) { ArrayList<Integer> res = new ArrayList<Integer>(); tree(root1, res); tree(root2, res); Collections.sort(res); return res; } public void tree(TreeNode root, ArrayList<Integer> list){ if(root == null) return; list.add(root.val); tree(root.left, list); tree(root.right, list); } } ``` ## Solution-2 Time complexity: O(n + m) Space complexity: O(n + m) ```java /** * 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 List<Integer> getAllElements(TreeNode root1, TreeNode root2) { ArrayList<Integer> res = new ArrayList<Integer>(); Stack<TreeNode> stack1 = new Stack(); Stack<TreeNode> stack2 = new Stack(); while(root1 != null || root2 != null || !stack1.empty() || !stack2.empty()) { while(root1 != null) { stack1.push(root1); root1 = root1.left; } while(root2 != null) { stack2.push(root2); root2 = root2.left; } if(stack2.empty() || (!stack1.empty() && stack1.peek().val <= stack2.peek().val)) { root1 = stack1.pop(); res.add(root1.val); root1 = root1.right; }else{ root2 = stack2.pop(); res.add(root2.val); root2 = root2.right; } } return res; } } ``` ## Reference https://leetcode.com/problems/all-elements-in-two-binary-search-trees/solutions/1720210/java-c-python-a-very-very-detailed-explanation/ https://leetcode.com/problems/all-elements-in-two-binary-search-trees/solutions/1719941/c-best-explanation-naive-and-optimal/