参考链接
- https://leetcode-cn.com/problems/find-a-corresponding-node-of-a-binary-tree-in-a-clone-of-that-tree/
题目描述
给你两棵二叉树,原始树 original 和克隆树 cloned,以及一个位于原始树 original 中的目标节点 target。
其中,克隆树 cloned 是原始树 original 的一个 副本 。
请找出在树 cloned 中,与 target 相同 的节点,并返回对该节点的引用(在 C/C++ 等有指针的语言中返回 节点指针,其他语言返回节点本身)。
注意:
你不能对两棵二叉树,以及target节点进行更改。
只能返回对克隆树cloned中已有的节点的引用。
进阶:如果树中允许出现值相同的节点,你将如何解答?
解题思路
遍历整棵克隆树即可,遇到值相等的节点就返回它的地址。
进阶版是当树中存在相同值的节点时,不能通过值相等来作为返回条件了。可以让原树和克隆树同时遍历,这样,遍历到目标节点时,克隆节点肯定也到了目标节点的位置。
代码
普通版
class Solution {
public:
int target_val;
TreeNode* res = NULL;
void traverse(TreeNode* node)
{
if (node == NULL)
{
return;
}
if (node->val == target_val)
{
res = node;
return;
}
traverse(node->left);
traverse(node->right);
}
TreeNode* getTargetCopy(TreeNode* original, TreeNode* cloned, TreeNode* target) {
target_val = target->val;
traverse(cloned);
return res;
}
};
进阶版
class Solution {
public:
TreeNode* res = NULL;
void traverse(TreeNode* original, TreeNode* cloned, TreeNode* target)
{
if (original == NULL)
{
return;
}
if (original == target)
{
res = cloned;
return;
}
traverse(original->left, cloned->left, target);
traverse(original->right, cloned->right, target);
}
TreeNode* getTargetCopy(TreeNode* original, TreeNode* cloned, TreeNode* target) {
traverse(original, cloned, target);
return res;
}
};