两棵二叉树的升序排列

116 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

题目描述

给你 root1 和 root2 这两棵二叉搜索树。请你返回一个列表,其中包含 两棵树 中的所有整数并按 升序 排序。

示例

image.png

输入: root1 = [2,1,4], root2 = [1,0,3]
输出: [0,1,1,2,3,4]

image.png

输入: root1 = [1,null,8], root2 = [8,1]
输出: [1,1,8,8]

提示

  • 每棵树的节点数在 [0, 5000] 范围内
  • -105 <= Node.val <= 105

暴力排序

要给两棵树所有元素进行排序展示,最简单的方法就是先将所有的元素加入到结果集合中,再一次性将所有元素进行排序即可得到一个有序的结果集。

class Solution {
    public List<Integer> getAllElements(TreeNode root1, TreeNode root2) {
        List<Integer> result = new ArrayList<>();
        // 将root1中所有元素加入结果集
        getAllElements(root1, result);
        // 将root2中所有元素加入结果集
        getAllElements(root2, result);
        // 排序
        Collections.sort(result);
        return result;
    }

    /**
     * 前序遍历,将元素加入结果集
     */
    private void getAllElements(TreeNode root, List<Integer> list){
        if(null == root){
            return;
        }
        list.add(root.val);
        getAllElements(root.left, list);
        getAllElements(root.right, list);
    }
}

双链表+中序遍历

上面的解法是先取得所有的元素,再整体进行排序,而采用双链表加中序遍历的话,则可以省略掉排序的步骤,因为中序遍历本身已经是排序好了的,我们定义两个链表,每次取两者间最小的值添加到结果集合中即可。

class Solution {
    public List<Integer> getAllElements(TreeNode root1, TreeNode root2) {
        List<Integer> res = new ArrayList<>();
        List<Integer> list1 = new ArrayList<>();
        List<Integer> list2 = new ArrayList<>();
        
        // 得到root1升序集合
        getAllElements(root1, list1);
        // 得到root2升序集合
        getAllElements(root2, list2);
        
        // 比较两个链表,取最小值
        int idx1 = 0, idx2 = 0;
        while(idx1 < list1.size() && idx2 < list2.size()){
            // 取两者最小值,同时将指针后移至下一元素
            if(list1.get(idx1) < list2.get(idx2)){
                res.add(list1.get(idx1++));
            }else{
                res.add(list2.get(idx2++));
            }
        }

        // 添加剩余原属
        while(idx1 < list1.size()){
            res.add(list1.get(idx1++));
        }
        while(idx2 < list2.size()){
            res.add(list2.get(idx2++));
        }

        return res;
    }

    private void getAllElements(TreeNode node, List<Integer> list){
        if(null == node){
            return;
        }
        getAllElements(node.left, list);
        list.add(node.val);
        getAllElements(node.right, list);
    }
}