2017-08-12 69 views
0

您好我想使用遞歸找到最左邊的二進制樹的行中的值。什麼更新爲無效遞歸函數

我嘗試做了這種方式:

class Solution { 

public: 
    int findBottomLeftValue(TreeNode* root) { 
     int lmValue = root -> val; 
     int Maxdepth = 0; 
     Maxdepth = helper(root, 0, Maxdepth, lmValue); 
     cout << Maxdepth; 
     return lmValue; 

    } 

private: 
    int helper(TreeNode* root, int depth, int Maxdepth, int lmValue) { 
     if (!root) 
      return depth; 

     int leftDepth = helper(root -> left, depth + 1, Maxdepth, lmValue); 
     int rightDepth = helper(root -> right, depth + 1, Maxdepth, lmValue); 

     int curDepth = max(leftDepth, rightDepth); 
     if (curDepth > Maxdepth) { 
      Maxdepth = curDepth; 
      lmValue = root -> val; 
     } 

     return Maxdepth; 

    } 
}; 

深度可以,因爲我回來就馬上更新。但是,lmValue無法更新。所以答案是錯誤的。

我發現裏面做這樣的解決方案:

class Solution { 
public: 
    void findBottomLeftValue(TreeNode* root, int& maxDepth, int& leftVal, int depth) { 
     if (root == NULL) { 
      return; 
     } 
     //Go to the left and right of each node 
     findBottomLeftValue(root->left, maxDepth, leftVal, depth+1); 
     findBottomLeftValue(root->right, maxDepth, leftVal, depth+1); 

     //Update leftVal and maxDepth 
     if (depth > maxDepth) { 
      maxDepth = depth; 
      leftVal = root->val; 
     } 
    } 

    //Entry function 
    int findBottomLeftValue(TreeNode* root) { 
     int maxDepth = 0; 
     //Initialize leftVal with root's value to cover the edge case with single node 
     int leftVal = root->val; 
     findBottomLeftValue(root, maxDepth, leftVal, 0); 
     return leftVal; 
    } 
}; 

我失去了在這裏是該解決方案不返回任何東西,但每個變量獲得在每個遞歸級別更新。

這就是說,如果我什麼都不返回,我會返回一切?

作爲新手,請給我一些指示。

感謝!

+0

不,你實際上沒有返回任何東西。你正在改變你的數據結構。你有使用可變數據結構的經驗嗎? –

+0

對不起,我只是有一些C++的基礎知識,而且我知道可變數據結構的含義,但是我對此沒有經驗。但我不知道我爲什麼要改變我的數據結構,請給我一些想法?謝謝。 – kingswanwho

+0

哦,我意識到第二個解決方案使用leftval和maxDepth的參考。但是我將自己的第一個解決方案從int lmValue更改爲int&lmValue,lmValue仍然沒有更新。 – kingswanwho

回答

0

這是一個非常寬泛的問題,但我會盡我所能給你一個總結。

void findBottomLeftValue(TreeNode* root, int& maxDepth, int& leftVal, int depth) { 
    // (Recursive calls removed, not relevant to this discussion...) 
    if (depth > maxDepth) { 
     maxDepth = depth; 
     leftVal = root->val; 
    } 
} 

在所述類型的前部的&意味着你通過引用傳遞變量。變量maxDepthleftVal未被複制到該函數中,因此對這些變量的賦值將反映在原始值中。這是pre-C++ 11代碼中從函數返回多個值的常見習慣用法。這是一個更簡單的例子。

void by_value(int x) { 
    x++; 
} 
void by_reference(int& x) { 
    x++; 
} 
int main() { 
    int var = 0; 
    cout << var << endl; // Prints 0 
    by_value(var); 
    cout << var << endl; // Prints 0, since the value was copied to the function 
    by_reference(var); 
    cout << var << endl; // Prints 1, since the value was passed by reference 
         // so the changes in the function are reflected in the 
         // caller 
} 
+0

非常感謝!我意識到這個問題。請你再看一下我自己的第一個解決方案代碼,因爲當我只是將int lmValue更改爲引用int&lmValue時,原始值仍未分配。 – kingswanwho

+0

您是否驗證過代碼中的if語句(執行lmValue分配)是否正在執行?我可以看到沒有任何直接的錯誤。 –

+1

看來,在你的第一個解決方案中,當你的遞歸展開到頂端時(即第一次調用helper函數),curDepth將總是大於Maxdepth,並且lmValue將始終設置爲root-> val,它位於頂部遞歸是樹的根部的值。 如果有幫助,我會通過一些示例樹來看看你的代碼在做什麼(你可以將它添加到你原來的帖子中),我想你會看到這個問題。 – jjaguayo