Question
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/all-elements-in-two-binary-search-trees/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Ideas
1、Answer( Java )
解法思路:前中后序遍历 + 简单排序
⚡️一个 二叉搜索树
的 中序遍历
结果是有序的
👍前中后序遍历 + 简单排序
Code
/**
* @author Listen 1024
* @description 1305. 两棵二叉搜索树中的所有元素( 二叉搜索树中序遍历 + 归并排序 )
* @date 2022-05-01 9:08
*/
//前中后序遍历 + 简单排序
class Solution {
ArrayList<Integer> res = new ArrayList<>();
public List<Integer> getAllElements(TreeNode root1, TreeNode root2) {
dfs(root1);
dfs(root2);
Collections.sort(res);
return res;
}
private void dfs(TreeNode root) {
if (root == null) {
return;
}
//前序遍历
res.add(root.val);
dfs(root.left);
dfs(root.right);
//中序遍历
// dfs(root.left);
// res.add(root.val);
// dfs(root.right);
//后序遍历
// dfs(root.left);
// dfs(root.right);
// res.add(root.val);
}
}
2、Answer( Java )
解法思路:二叉搜索树中序遍历 + 归并排序
⚡️一个 二叉搜索树
的 中序遍历
结果是有序的
👍中序遍历这两棵二叉搜索树,可以得到两个有序数组。然后可以使用 双指针
方法来合并这两个有序数组,这一方法将两个数组看作两个队列,每次从队列头部取出比较小的数字放到结果中(头部相同时可任取一个)
Code
/**
* @author Listen 1024
* @description 1305. 两棵二叉搜索树中的所有元素( 二叉搜索树中序遍历 + 归并排序 )
* @date 2022-05-01 9:08
*/
class Solution {
public List<Integer> getAllElements(TreeNode root1, TreeNode root2) {
List<Integer> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
inOrderTraversal(root1, list1);
inOrderTraversal(root2, list2);
ArrayList<Integer> res = new ArrayList<>();
int index1 = 0, index2 = 0;
while (true) {
if (index1 == list1.size()) {
res.addAll(list2.subList(index2, list2.size()));
break;
}
if (index2 == list2.size()) {
res.addAll(list1.subList(index1, list1.size()));
break;
}
if (list1.get(index1) < list2.get(index2)) {
res.add(list1.get(index1++));
} else {
res.add(list2.get(index2++));
}
}
return res;
}
private void inOrderTraversal(TreeNode root, List<Integer> list) {
if (root == null) {
return;
}
inOrderTraversal(root.left, list);
list.add(root.val);
inOrderTraversal(root.right, list);
}
}
//部分题解参考链接(如侵删)
https://leetcode-cn.com/problems/all-elements-in-two-binary-search-trees/solution/liang-ke-er-cha-sou-suo-shu-zhong-de-suo-you-yua-3/