持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
题目描述
给你 root1 和 root2 这两棵二叉搜索树。请你返回一个列表,其中包含 两棵树 中的所有整数并按 升序 排序。
示例
输入: root1 = [2,1,4], root2 = [1,0,3]
输出: [0,1,1,2,3,4]
输入: 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);
}
}