617. 合并二叉树

image.png

先序递归

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
  18. //先序递归
  19. if(root1 == null ) return root2;
  20. if(root2 == null ) return root1;
  21. root1.val = root1.val + root2.val; //中
  22. root1.left = mergeTrees(root1.left,root2.left); //左
  23. root1.right = mergeTrees(root1.right,root2.right); //右
  24. return root1;
  25. }
  26. }

中序递归

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
  18. //中序
  19. if(root1 == null ) return root2;
  20. if(root2 == null ) return root1;
  21. root1.left = mergeTrees(root1.left,root2.left);
  22. root1.val += root2.val;
  23. root1.right = mergeTrees(root1.right,root2.right);
  24. return root1;
  25. }
  26. }

后续递归

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
  18. //后序
  19. if(root1 == null ) return root2;
  20. if(root2 == null ) return root1;
  21. root1.left = mergeTrees(root1.left,root2.left);
  22. root1.right = mergeTrees(root1.right,root2.right);
  23. root1.val += root2.val;
  24. return root1;
  25. }
  26. }

递归不改变原树

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
  18. if(root1 == null ) return root2;
  19. if(root2 == null ) return root1;
  20. // 重新定义新的节点,不修改原有两个树的结构
  21. TreeNode root = new TreeNode(root1.val + root2.val);
  22. root.left = mergeTrees(root1.left,root2.left);
  23. root.right = mergeTrees(root1.right,root2.right);
  24. return root;
  25. }
  26. }

栈(先序)

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
  18. // 使用栈迭代(先序)
  19. if(root1 == null ) return root2;
  20. if(root2 == null ) return root1;
  21. Stack<TreeNode> stack = new Stack<>();
  22. stack.push(root2);
  23. stack.push(root1);
  24. while(! stack.isEmpty() ) {
  25. TreeNode node1 = stack.pop();
  26. TreeNode node2 = stack.pop();
  27. node1.val += node2.val;
  28. if(node2.right != null && node1.right != null ) {
  29. stack.push(node2.right);
  30. stack.push(node1.right);
  31. } else if(node1.right == null ) {
  32. node1.right = node2.right;
  33. }
  34. if(node2.left != null && node1.left != null ) {
  35. stack.push(node2.left);
  36. stack.push(node1.left);
  37. } else if(node1.left == null ) {
  38. node1.left = node2.left;
  39. }
  40. }
  41. return root1;
  42. }
  43. }

队列

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
  18. if(root1 == null ) return root2;
  19. if(root2 == null ) return root1;
  20. Queue<TreeNode> que = new LinkedList<>();
  21. que.add(root1);
  22. que.add(root2);
  23. while (! que.isEmpty() ) {
  24. TreeNode node1 = que.poll();
  25. TreeNode node2 = que.poll();
  26. node1.val += node2.val;
  27. if(node1.left != null && node2.left != null ) {
  28. que.add(node1.left);
  29. que.add(node2.left);
  30. } else if(node1.left == null ) {
  31. node1.left = node2.left;
  32. }
  33. if(node1.right != null && node2.right != null ) {
  34. que.add(node1.right);
  35. que.add(node2.right);
  36. } else if(node1.right == null ) {
  37. node1.right = node2.right;
  38. }
  39. }
  40. return root1;
  41. }
  42. }