LeetCode刷题记录(二十九):两棵二叉搜索树中的所有元素

120 阅读2分钟

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

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

image.png

题目解析

题目素材解析

根据题目描述来看,一共给出了两个二叉树。

  1. 二叉树root1。

  2. 二叉树root2。

代码和题目描述中,分别给出了二叉树TreeNode的具体实现类,还有二叉树的图例。

并且二叉树的节点控制在0到5000之间。要注意测试用例会存在二叉树节点为0的情况的。

我的解读

我感觉这道题不能算是中等题,如果再进阶一些,控制一下时间复杂度的话会更符合中等难度。

所以这道题总归就两点:

  1. 如何获取二叉树中的各个元素值?因为存在树结构,还是推荐递归的方式来解决。

  2. 如何对list集合进行有效排序?排序方式有很多,看解题者的喜好了,我直接用了Java集合内置的方法,显然对得起我的运行结果。

这里面的优化点,并不在前者,更好的优化点还是在排序问题上。

解题思路

解题思路很清晰明了,简述一下解题过程吧。

第一步,声明一个结果值集合。

第二步,判断两个二叉树是否为空;如果为空,则忽略不计。

第三步,如果不为空的情况下,则进入递归逻辑。

第四步,在递归逻辑中,只需要将当前树的节点值放入结果list集合中。

第五步,随后判断当前树下的左连接点和右节点是否为空,如果不为空,则进入递归逻辑;为空则退出递归。

第六步,当全部的节点值均放入list集合中后,利用List集合的排序方法进行排序后返回即可。

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {

    public List<Integer> getAllElements(TreeNode root1, TreeNode root2) {
        List<Integer> list = new ArrayList<>();
        if(root1 != null){
            addE(list, root1);
        }
        if(root2 != null){
            addE(list, root2);
        }
        return list.stream().sorted().collect(Collectors.toList());
    }

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

}

执行结果

第一次提交失败是因为没有给root1和root2二叉树判空,所以这点要注意一下。

image.png

Java代码本地执行

在解答其他题的时候在程序中还是挺好实现的。

但是每次有这种测试用例提供数组,然后自动转成树结构的题,在本地调试可是相当的费脑筋。

比起实现这道题来说,这道题在本地调试上下的功夫更多些。

Java本地可调试代码,请参考github/Ijiran,可通过索引看到相应代码。