解法一:广度优先搜索

提示中说明了树中没有两个结点有相同的值,那么找相同结点其实就是遍历并且比较结点的val属性的过程。original结点我觉得其实完全用不到。先用深度优先搜索做一遍。

  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 final TreeNode getTargetCopy(final TreeNode original, final TreeNode cloned, final TreeNode target) {
  12. if (cloned == null) {
  13. return null;
  14. }
  15. Queue<TreeNode> queue = new LinkedList<>();
  16. queue.offer(cloned);
  17. TreeNode tmp;
  18. while (!queue.isEmpty()) {
  19. tmp = queue.poll();
  20. if (tmp.val == target.val) {
  21. return tmp;
  22. }
  23. if (tmp.left != null) {
  24. queue.offer(tmp.left);
  25. }
  26. if (tmp.right != null) {
  27. queue.offer(tmp.right);
  28. }
  29. }
  30. return null;
  31. }
  32. }

解法二:深度优先搜索

看了下提交结果,似乎这道题用深搜会更快一些,用深搜也写一遍。

  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 final TreeNode getTargetCopy(final TreeNode original, final TreeNode cloned, final TreeNode target) {
  12. if (cloned == null) {
  13. return null;
  14. }
  15. if (cloned.val == target.val) {
  16. return cloned;
  17. }
  18. TreeNode ans = null;
  19. if (cloned.left != null) {
  20. ans = getTargetCopy(original, cloned.left, target);
  21. }
  22. if (ans != null) {
  23. return ans;
  24. } else {
  25. return getTargetCopy(original, cloned.right, target);
  26. }
  27. }
  28. }