簡體   English   中英

使用 DFS 在克隆樹中查找節點

[英]Finding a node in a cloned tree using DFS

我正在嘗試 LeetCode 問題 1379。 在該樹的克隆中找到二叉樹的對應節點

給定兩個originalcloned的二叉樹,並給出對原始樹中節點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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM