題目地址:https://leetcode-cn.com/problems/er-cha-shu-de-shen-du-lcof/
題目描述
輸入一棵二叉樹的根節點,求該樹的深度。從根節點到葉節點依次經過的節點(含根、葉節點)形成樹的一條路徑,最長路徑的長度為樹的深度。
題目示例
例如:
給定二叉樹 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
解題思路
二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數
DFS(深度優先搜索-遞歸):深度優先搜索方法常常采用遞歸或者棧的方法實現,在這里我們使用遞歸的方法解決,直接返回樹的深度等於左子樹和右子樹之中的最大值+1,即h = max(maxDepth(root->letf), maxDepth(root->right) + 1。二叉樹的深度計算方法如下
- 如果二叉樹為一個節點,則二叉樹深度h=1
- 如果二叉樹沒有左子樹,則二叉樹深度h=右子樹深度+1,反之,如果二叉樹沒有右子樹,則二叉樹深度h=左子樹深度+1
- 如果二叉樹既有左子樹又有右子樹,則則二叉樹深度h=max(左子樹深度,右子樹深度)+1
DFS(深度優先搜索-非遞歸-棧):中序遍歷順序為”左子樹->根節點->右子樹“,在這里我們使用中序遍歷方法找到二叉樹的最大深度,從根節點開始,此時並不需要將根節點入棧,先遍歷左子樹,將左子樹所有元素入棧之后,再將根節點入棧,最后,右子樹入棧。
BFS(廣度優先搜索):廣度優先搜索方法常采用隊列來實現,遍歷隊列中的各節點,並將其左子節點和右子節點分別加入隊列。然后,對二叉樹一層一層遍歷,每遍歷一層,深度加1。
程序源碼
DFS(遞歸)
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: int maxDepth(TreeNode* root) { if(root == nullptr) return 0;
return max(maxDepth(root->left), maxDepth(root->right)) + 1; } };
DFS(非遞歸-棧)
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: int maxDepth(TreeNode* root) { if(root == nullptr) return 0; stack<pair<TreeNode*, int>> s; int deep = 0, cur_deep = 0; TreeNode* p = root; while(!s.empty() || p != nullptr) //若棧非空,則表示還有一些元素的右子樹未訪問,若p非空,則說明還有一些元素的左子樹未訪問, { while(p != nullptr) { s.push(pair<TreeNode*, int>(p, ++cur_deep)); //一直往左子樹走,直到葉子節點 p = p->left; } p = s.top().first; cur_deep = s.top().second; if(cur_deep > deep) deep = cur_deep; s.pop(); p = p->right; } return deep; } };
BFS(隊列)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int maxDepth(TreeNode* root) {
if(root == nullptr) return 0;
queue<TreeNode*> que;
que.push(root);
int depth = 0;
while(!que.empty()) //隊列不為空,表示還有元素未訪問
{
depth++;
int cur_len = que.size();
for(int i = 0; i < cur_len; i++) //一個for循環表示一層
{
TreeNode* curNode = que.front();
que.pop();
if(curNode->left != nullptr) que.push(curNode->left);
if(curNode->right != nullptr) que.push(curNode->right);
}
}
return depth;
}
};