104. 二叉樹的最大深度
給定一個二叉樹,找出其最大深度。
二叉樹的深度爲根節點到最遠葉子節點的最長路徑上的節點數。
說明: 葉子節點是指沒有子節點的節點。
示例:
給定二叉樹 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
解法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==NULL) return 0;
else{
int left_height = maxDepth(root->left);
int right_height = maxDepth(root->right);
return max(left_height,right_height)+1;
}
}
};
複雜度分析
時間複雜度:我們每個結點只訪問一次,因此時間複雜度爲 O(N),其中 N 是結點的數量。
空間複雜度:在最糟糕的情況下,樹是完全不平衡的,例如每個結點只剩下左子結點,遞歸將會被調用 N 次(樹的高度),因此保持調用棧的存儲將是 O(N)。但在最好的情況下(樹是完全平衡的),樹的高度將是 log(N)。因此,在這種情況下的空間複雜度將是 O(log(N)。
解法2:廣度優先搜索(BFS)
//直接改寫按序遍歷二叉樹的代碼,輸出二維數組的元素個數即可
class Solution {
public:
int maxDepth(TreeNode* root) {
vector <vector <int>> ret; //定義輸出的二維數組
if (!root) return 0; //如果沒有節點,輸出0
queue <TreeNode*> q; //定義結構體隊列q
q.push(root); //將根節點加入進去
while (!q.empty()) { //當隊列不爲空時,即表示二叉樹還存在左右子樹
int currentLevelSize = q.size(); //當前隊列q內的元素個數
ret.push_back(vector <int> ()); //輸出ret加入一個新的空vector
for (int i = 1; i <= currentLevelSize; i++) {
auto node = q.front(); q.pop(); //node取爲q的第一個元素,再去掉這個元素
ret.back().push_back(node->val); //給ret的最後一個元素即空vector加入q的第一個元素
if (node->left) q.push(node->left); //如果存在左節點,給隊列q加入該節點
if (node->right) q.push(node->right);
}
}
return ret.size();
}
};
//不需要定義二維數組,用一個int型變量表示即可
class Solution {
public:
int maxDepth(TreeNode* root) {
if (!root) return 0; //如果沒有節點,輸出0
int depth=0;
queue <TreeNode*> q; //定義結構體隊列q
q.push(root); //將根節點加入進去
while (!q.empty()) { //當隊列不爲空時,即表示二叉樹還存在左右子樹
int currentLevelSize = q.size(); //當前隊列q內的元素個數
for (int i = 1; i <= currentLevelSize; i++) {
auto node = q.front(); q.pop(); //node取爲q的第一個元素,再去掉這個元素
if (node->left) q.push(node->left); //如果存在左節點,給隊列q加入該節點
if (node->right) q.push(node->right);
}
depth++;
}
return depth;
}
};
111. 二叉樹的最小深度
給定一個二叉樹,找出其最小深度。
最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。
說明: 葉子節點是指沒有子節點的節點。
示例:
給定二叉樹 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最小深度 2.
解法 - 遞歸
int minDepth(TreeNode* root) {
if(root == NULL) return 0; //空樹深度爲0
if(root -> left == NULL && root -> right == NULL) return 1; //左右子樹爲空,深度爲1
//根據題意,若一顆子樹爲空,則最小深度爲非空子樹的最小深度加一
if(root -> left == NULL && root -> right != NULL) return minDepth(root -> right) + 1;
if(root -> left != NULL && root -> right == NULL) return minDepth(root -> left) + 1;
//若兩顆子樹都非空,則最小深度爲左右子樹最小深度較小者加一
return min(minDepth(root -> left), minDepth(root -> right)) + 1;
}