赞
踩
题目解析1
先不要看cloned,我们就来看看original。如果想要去original中寻找和target中一样的(找位置),那应该怎么找呢?
// 返回要找的 TreeNode* getTargetCopy(TreeNode* original, TreeNode* target) { // 没有找到 if(original == NULL){ return NULL; } // 当前树就是要找的 if(original == target){ return original; } // 没有找到,那么去左子树中找 TreeNode *ans = getTargetCopy(original->left, target); if(ans != NULL){ // 左子树中找到了 return ans; //就不用去右子树中找了,直接返回 } ans = getTargetCopy(original->right, target); if(ans != NULL){ //右子树中找到了 return ans; // 那就直接返回 } // 左右子树中均找不到 return NULL; }
又因为cloned是target的克隆,因此
TreeNode* getTargetCopy(TreeNode* original, TreeNode* cloned, TreeNode* target) { if(original == NULL){ return NULL; } if(original == target){ return cloned; } TreeNode *ans = getTargetCopy(original->left, cloned->left, target); if(ans != NULL){ return ans; } ans = getTargetCopy(original->right, cloned->right, target); return ans; }
题目解析2
original树和cloned树的结构,以及所有节点对应的值都是一模一样。基本可以理解成两个"相同"的树(但是内存地址不同,本质上并不一样)。
要在original树中来寻找target,自然想到的就是遍历original树。那么正常的前中后序遍历,应该选择哪一个呢?
前序遍历。
因为只要original和target相同,则表示对应的cloned就是我们想要的节点。这个遍历过程,和左右子树并没有关系。所以我们选择前序遍历。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public final TreeNode getTargetCopy(final TreeNode original, final TreeNode cloned, final TreeNode target) { if (original == null || cloned == null){ return null; } if (original == target){ return cloned; } TreeNode res = getTargetCopy(original.left, cloned.left, target); if (res != null){ return res; } res = getTargetCopy(original.right, cloned.right, target); if (res != null){ return res; } return null; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。