解法一
先分别进行先序遍历,得到升序数组,再将两数组归并。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> getAllElements(TreeNode root1, TreeNode root2) {
List<Integer> list1 = new LinkedList<>();
List<Integer> list2 = new LinkedList<>();
preOrder(root1, list1);
preOrder(root2, list2);
return merge(list1, list2);
}
/**
* 先序遍历
*
* @param root 当前根结点
* @param list 结点值升序数组
*/
private void preOrder(TreeNode root, List<Integer> list) {
if (root == null) {
return;
}
preOrder(root.left, list);
list.add(root.val);
preOrder(root.right, list);
}
/**
* 归并排序, 输入数组均已升序排列
*
* @param list1 数组1
* @param list2 数组2
* @return 升序排列的归并后数组
*/
private List<Integer> merge(List<Integer> list1, List<Integer> list2) {
ListIterator<Integer> iter1 = list1.listIterator();
ListIterator<Integer> iter2 = list2.listIterator();
List<Integer> ans = new ArrayList<>(list1.size() + list2.size());
int e1, e2;
while (iter1.hasNext() && iter2.hasNext()) {
e1 = iter1.next();
e2 = iter2.next();
if (e1 < e2) {
ans.add(e1);
iter2.previous();
} else {
ans.add(e2);
iter1.previous();
}
}
while (iter1.hasNext()) {
ans.add(iter1.next());
}
while (iter2.hasNext()) {
ans.add(iter2.next());
}
return ans;
}
}