[英]Finding a node in a cloned tree using DFS
我正在嘗試 LeetCode 問題 1379。 在該樹的克隆中找到二叉樹的對應節點:
給定兩個
original
和cloned
的二叉樹,並給出對原始樹中節點target
的引用。
cloned
的樹是original
樹的副本。返回對克隆樹中同一節點的引用。
請注意,您不得更改任何兩棵樹或
target
節點,答案必須是對cloned
樹中節點的引用。
這是我的代碼:
class Solution {
public:
TreeNode* ans = NULL ;
TreeNode* getTargetCopy(TreeNode* original, TreeNode* cloned, TreeNode* target) {
// if(cloned == NULL){return cloned ;}
if(cloned == NULL){return cloned ;}
// if(cloned->val == target->val){
// return cloned ;
// }
if(cloned->val == target->val){
ans = cloned ;
}
// return getTargetCopy(original,cloned->left ,target) ;
// return getTargetCopy(original,cloned->right,target) ;
getTargetCopy(original,cloned->left ,target) ;
getTargetCopy(original,cloned->right,target) ;
return ans ;
}
};
注釋掉的部分是我的初始代碼,但它返回了錯誤的答案
您的意見
[7,4,3,null,null,6,19]
3
Output
null
預期的
3
幫助我理解代碼中的問題
一些問題:
使用這些(現已注釋)行:
return getTargetCopy(original,cloned->left ,target) ;
return getTargetCopy(original,cloned->right,target) ;
...執行永遠不會到達第二行,因為第一行將結束 function。
這些(現已注釋)行:
if(cloned->val == target->val){
return cloned ;
}
...很好:一旦你找到了目標值,就不需要在這個 function 中做任何其他事情,所以返回節點就可以了。 這比為該節點設置ans
並仍然進行一些(不必要的)遞歸調用要好。
這里缺少的是從第一個遞歸調用中獲取值,並確定該調用是否成功找到目標值。 如果它找到它,則不再需要第二次遞歸調用。 如果沒有找到,則需要第二次遞歸調用。 最后,您從任一遞歸調用中獲得的返回值應作為當前函數的返回值返回。
所以:
class Solution {
public:
TreeNode* getTargetCopy(TreeNode* original, TreeNode* cloned, TreeNode* target) {
if (cloned == nullptr || cloned->val == target->val) {
return cloned;
}
TreeNode *ans = getTargetCopy(original,cloned->left ,target) ;
if (ans != nullptr) {
return ans;
}
return getTargetCopy(original,cloned->right,target) ;
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.