求解最二叉樹的最大深度
知識點
對於樹的操作:深度優先搜索: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;
}
};
// 結果是錯的,我也不知道錯在什麼地方了;
小結
熱愛你正在做的事情——編程。這份工作高薪,並且極具成就感;獲得成就感的前提是,努力提高自己的技術,真正做出點東西來。不斷花時間練習才能得到正反饋,形成良性循環;