theme: smartblue
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
两棵二叉搜索树中的所有元素
题目解析
题目素材解析
根据题目描述来看,一共给出了两个二叉树。
二叉树root1。
二叉树root2。
代码和题目描述中,分别给出了二叉树TreeNode的具体实现类,还有二叉树的图例。
并且二叉树的节点控制在0到5000之间。要注意测试用例会存在二叉树节点为0的情况的。
我的解读
我感觉这道题不能算是中等题,如果再进阶一些,控制一下时间复杂度的话会更符合中等难度。
所以这道题总归就两点:
如何获取二叉树中的各个元素值?因为存在树结构,还是推荐递归的方式来解决。
如何对list集合进行有效排序?排序方式有很多,看解题者的喜好了,我直接用了Java集合内置的方法,显然对得起我的运行结果。
这里面的优化点,并不在前者,更好的优化点还是在排序问题上。
解题思路
解题思路很清晰明了,简述一下解题过程吧。
第一步,声明一个结果值集合。
第二步,判断两个二叉树是否为空;如果为空,则忽略不计。
第三步,如果不为空的情况下,则进入递归逻辑。
第四步,在递归逻辑中,只需要将当前树的节点值放入结果list集合中。
第五步,随后判断当前树下的左连接点和右节点是否为空,如果不为空,则进入递归逻辑;为空则退出递归。
第六步,当全部的节点值均放入list集合中后,利用List集合的排序方法进行排序后返回即可。
代码
```java /** * 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二叉树判空,所以这点要注意一下。
Java代码本地执行
在解答其他题的时候在程序中还是挺好实现的。
但是每次有这种测试用例提供数组,然后自动转成树结构的题,在本地调试可是相当的费脑筋。
比起实现这道题来说,这道题在本地调试上下的功夫更多些。
Java本地可调试代码,请参考github/Ijiran,可通过索引看到相应代码。