解法一

先分别进行先序遍历,得到升序数组,再将两数组归并。

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode(int x) { val = x; }
  8. * }
  9. */
  10. class Solution {
  11. public List<Integer> getAllElements(TreeNode root1, TreeNode root2) {
  12. List<Integer> list1 = new LinkedList<>();
  13. List<Integer> list2 = new LinkedList<>();
  14. preOrder(root1, list1);
  15. preOrder(root2, list2);
  16. return merge(list1, list2);
  17. }
  18. /**
  19. * 先序遍历
  20. *
  21. * @param root 当前根结点
  22. * @param list 结点值升序数组
  23. */
  24. private void preOrder(TreeNode root, List<Integer> list) {
  25. if (root == null) {
  26. return;
  27. }
  28. preOrder(root.left, list);
  29. list.add(root.val);
  30. preOrder(root.right, list);
  31. }
  32. /**
  33. * 归并排序, 输入数组均已升序排列
  34. *
  35. * @param list1 数组1
  36. * @param list2 数组2
  37. * @return 升序排列的归并后数组
  38. */
  39. private List<Integer> merge(List<Integer> list1, List<Integer> list2) {
  40. ListIterator<Integer> iter1 = list1.listIterator();
  41. ListIterator<Integer> iter2 = list2.listIterator();
  42. List<Integer> ans = new ArrayList<>(list1.size() + list2.size());
  43. int e1, e2;
  44. while (iter1.hasNext() && iter2.hasNext()) {
  45. e1 = iter1.next();
  46. e2 = iter2.next();
  47. if (e1 < e2) {
  48. ans.add(e1);
  49. iter2.previous();
  50. } else {
  51. ans.add(e2);
  52. iter1.previous();
  53. }
  54. }
  55. while (iter1.hasNext()) {
  56. ans.add(iter1.next());
  57. }
  58. while (iter2.hasNext()) {
  59. ans.add(iter2.next());
  60. }
  61. return ans;
  62. }
  63. }