leetcode刷题记录 1305 两颗二叉搜索树中的所有元素

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;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_40453090/article/details/108470056