LeetCode 1305. 两棵二叉搜索树中的所有元素

 标签:排序,二叉搜索树

给你 root1 和 root2 这两棵二叉搜索树。

请你返回一个列表,其中包含 两棵树 中的所有整数并按 升序 排序。

示例 1:

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

输出:[0,1,1,2,3,4]

 

示例 2:

输入:root1 = [0,-10,10], root2 = [5,1,7,0,2]

输出:[-10,0,0,1,2,5,7,10]

 

示例 3:

输入:root1 = [], root2 = [5,1,7,0,2]

输出:[0,1,2,5,7]

 

示例 4:

输入:root1 = [0,-10,10], root2 = []

输出:[-10,0,10]

 

示例 5:

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

输出:[1,1,8,8]

 

提示:

  • 每棵树最多有 5000 个节点。

  • 每个节点的值在 [-10^5, 10^5] 之间。

解法1:

class Solution {    List<Integer> ans = new ArrayList<>();    public List<Integer> getAllElements(TreeNode root1, TreeNode root2) {        preTreeNode(root1);        preTreeNode(root2);        ans.sort((Comparator.comparingInt(a -> a)));        return ans;    }    // 前序遍历TreeNode,把结果存入ans(ArrayList类型)中    private void preTreeNode(TreeNode root) {        if (root == null) {            return;        }        ans.add(root.val);        if (root.left != null) {            preTreeNode(root.left);        }        if (root.right != null) {            preTreeNode(root.right);        }    }}

想到的最简单的方法是,对两棵树进行任意形式的遍历,上面的例子给出的是前序遍历。并将遍历到的所有元素放入一个List中,最后对这个数组进行排序即可。执行的结果如下:

复杂度分析:

  • 时间复杂度:O((M+N)log(M+N)),其中 M 和 N 是两棵树中的节点个数。

  • 空间复杂度:O(M + N),其中 M 和 N 是两棵树中的节点个数。

 执行的效果只能说一般。因为这种方法没有利用到二叉搜索树本身的性质。如果我们对二叉搜索树进行中序遍历,就可以直接得到树中所有元素升序排序后的结果,减少后面的排序算法的调换位置等操作。因此我们可以对两棵树分别进行中序遍历,它们分别存到ans结果列表中,然后进行排序,就可以得到最终的结果。

解法二:

class Solution {    List<Integer> ans = new ArrayList<>();    public List<Integer> getAllElements(TreeNode root1, TreeNode root2) {        midTreeNode(root1);        midTreeNode(root2);        ans.sort((Comparator.comparingInt(a -> a)));        return ans;    }    // 中序遍历TreeNode,把结果存入ans(ArrayList类型)中    private void midTreeNode(TreeNode root) {        if (root == null) {            return;        }        if (root.left != null) {            midTreeNode(root.left);        }        ans.add(root.val);        if (root.right != null) {            midTreeNode(root.right);        }    }}

这里没做上面大的改动,只是把前序遍历改成中序遍历。​执行结果如下:

执行结果如上。效果还不错​。最后查看了一下跑13ms代码,​解法和我第二种思路是一样的。可能是之前测试用例​数据较少所以有些时间的差别。这个和官方的题解思路也是一样的。​

往期内容

leetcode 167. 两数之和 II - 输入有序数组

leetcode 15. 三数之和

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值