leetcode 1305 两颗二叉搜索树中的所有元素
解题思路:我们知道二叉搜索树的中序遍历是升序排列的,所以说我们这道题可以这样做:
1.先中序遍历两个二叉树,将遍历的结果分别存放到list1和list2中。
2.使用归并排序将两个排好序的list合并,即为我们所求的结果。
class Solution {
public List<Integer> getAllElements(TreeNode root1, TreeNode root2) {
List<Integer> ansList1 = new ArrayList<>();
List<Integer> ansList2 = new ArrayList<>();
dfs(root1,ansList1);
dfs(root2,ansList2);
return merge(ansList1,ansList2);
}
public void dfs(TreeNode node , List<Integer>list){
if(node == null){
return;
}
dfs(node.left,list);
list.add(node.val);
dfs(node.right,list);
}
public List<Integer> merge(List<Integer> ansList1,List<Integer> ansList2){
List<Integer> ansList = new ArrayList<>();
int size1 = ansList1.size();
int size2 = ansList2.size();
int index1 ,index2;
for(index1 = 0,index2 = 0;index1<size1 && index2<size2;){
if(ansList1.get(index1)<ansList2.get(index2)){
ansList.add(ansList1.get(index1));
index1++;
}else{
ansList.add(ansList2.get(index2));
index2++;
}
}
while(index1<size1){
ansList.add(ansList1.get(index1));
index1++;
}
while(index2<size2){
ansList.add(ansList2.get(index2));
index2++;
}
return ansList;
}
}
我们还可以这样做:既然是升序排序的,那么我们不妨使用优先队列(最小堆),思路如下:
1.在树遍历的时候用一个优先队列(默认小根堆)来添加元素;
2.然后,将优先队列的元素逐个取出到listlist中即可。
Class Solution{
private PriorityQueue<Integer> priorityQueue;
private void dfs(TreeNode root) {
if (root == null) {
return;
}
priorityQueue.offer(root.val);
dfs(root.left);
dfs(root.right);
}
public List<Integer> getAllElements(TreeNode root1, TreeNode root2) {
priorityQueue = new PriorityQueue<>();
dfs(root1);
dfs(root2);
List<Integer> ansList = new ArrayList<>();
while (!priorityQueue.isEmpty()) {
ansList.add(priorityQueue.poll());
}
return ansList;
}
}