動手刷LeetCode-求二叉樹的最大深度

二叉樹的最大深度


求解最二叉樹的最大深度

知識點

對於樹的操作:深度優先搜索:DFS,寬度優先搜素:BFS;樹的很多問題都是有這兩種方法即可解決;
隊列和棧的算法;

解題思路

解法一:遞歸法
遞歸思想:樹的深度,此時可以直接結束遞歸函數,並返回空節點的深度爲 0。

在遞歸算法中,遞歸函數的設計非常重要,首先我們要先明確該函數的作用,然後再確定何時結束與何時調用該函數。

**明確函數作用
該函數的作用用一句話概括就是:計算節點的最大深度。

函數輸入:確定的節點
函數輸出:該節點的最大深度
何時結束
當輸入的節點爲空節點時,我們無需繼續計算其子樹的深度,此時可以直接結束遞歸函數,並返回空節點的深度爲 0。

何時調用
當輸入節點爲非空節點時,該節點的深度取決於其左右子樹的深度,即:

maxDepth(root) = max(maxDepth(root.left), maxDepth(root.right)) + 1
此時需要進行函數的遞歸調用。

** 但是遞歸函數佔用大量的參數棧佔空間,99%的遞歸算法可以轉化爲用棧的非遞歸算法**

class Solution {
public:
    int maxDepth(TreeNode* root) { // think of it in a precious way
        if(root==NULL){
            return 0;
        }
        int ans;
        if(root!=NULL){
             ans= maxDepth2(root->left,root->right);
        }
       
        return ans;
        
    }

// we can define another pvivate function 
// left tree and rigtht tree
private:
    int maxDepth2(TreeNode* pl,TreeNode* pr){
        static int count=1; // define count;
        

        if(pl==NULL && pr!=NULL){
            count++;
            maxDepth2(pr->left,pr->right);
        }
        if(pl!=NULL && pr==NULL){
            count++;
            maxDepth2(pl->left,pl->right);
        }
        if(pl!=NULL && pr!=NULL){
            count++;
            count=max(maxDepth2(pl->left,pl->right) ,maxDepth2(pr->left,pr->right));
        }
        
        return count;
    }
};
// 結果是錯的,我也不知道錯在什麼地方了;

小結

熱愛你正在做的事情——編程。這份工作高薪,並且極具成就感;獲得成就感的前提是,努力提高自己的技術,真正做出點東西來。不斷花時間練習才能得到正反饋,形成良性循環;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章