刷题笔记
1305. All Elements in Two Binary Search Trees
题目
Given two binary search trees root1 and root2.
Return a list containing all the integers from both trees sorted in ascending order.
思路
- 首先想到要把两个树中的元素全部取到一个list中,然后对这个list进行排序并返回即可。
- 取树元素可以利用递归思想,对两个树分别递归取出元素即可。
代码实现
class Solution {
public List<Integer> getAllElements(TreeNode root1, TreeNode root2) {
List<Integer> ans = new ArrayList<>();
get(root1, ans);
get(root2, ans);
Collections.sort(ans);
return ans;
}
public static void get(TreeNode n, List<Integer> ans) {
if (null == n) return;
get(n.left, ans);
ans.add(n.val);
get(n.right, ans);
}
}
上面的代码是最基础的一种思路,将两个树全部取出然后sort。
public List<Integer> getAllElements(TreeNode root1, TreeNode root2) {
Queue<Integer> q1 = new LinkedList<>(), q2 = new LinkedList<>();
inorder(root1, q1);
inorder(root2, q2);
List<Integer> ans = new ArrayList<>();
while (!q1.isEmpty() || !q2.isEmpty())
if (q2.isEmpty())
ans.add(q1.poll());
else if (q1.isEmpty())
ans.add(q2.poll());
else
ans.add(q1.peek() < q2.peek() ? q1.poll() : q2.poll());
return ans;
}
private void inorder(TreeNode n, Queue<Integer> q) {
if (n == null) return;
inorder(n.left, q);
q.offer(n.val);
inorder(n.right, q);
}
另一种思路是取出两个队列,然后对两个队列merge。
但是这种思路实际跑出来的效果并不如第一种,虽然我认为这种算法可以节省一部分运算。