104.二叉樹的最大深度
題目連結 文章講解 影片講解
- 二叉樹節點的深度:指從根節點到該節點的最長簡單路徑邊的條數(前序遍歷)
- 二叉樹節點的高度:指從該節點到葉子節點的最長簡單路徑邊的條數(後序遍歷)
遞迴法
// 二叉樹的最大高度和最大深度相同,可以求最大高度來表示最大深度
class Solution {
public:
int maxDepth(TreeNode* root) {
return getHeight(root);
}
int getHeight(TreeNode* node) {
if(node == nullptr) return 0;
int leftHeight = getHeight(node->left); // 左
int rightHeight = getHeight(node->right); // 右
int height = 1 + max(leftHeight, rightHeight); //中
return height;
}
};
層序遍歷法
class Solution {
public:
int maxDepth(TreeNode* root) {
queue<TreeNode*> que;
if(root == nullptr) return 0;
que.push(root);
int depth = 0;
while(!que.empty()) {
int size = que.size();
// 每一層出隊時記錄深度
depth++;
while(size--) {
TreeNode* temp = que.front();
que.pop();
if(temp->left) que.push(temp->left);
if(temp->right) que.push(temp->right);
}
}
return depth;
}
};
111.二叉樹的最小深度
題目連結 文章講解 影片講解
注:最小深度是從根節點到最近葉子節點的最短路徑上的節點數量,空節點不算葉節點
class Solution {
public:
int getHeight(TreeNode* node) {
if(node == nullptr) return 0;
int leftHeight = getHeight(node->left); // 左
int rightHeignt = getHeight(node->right); // 右
if(node->left == nullptr && node->right) return 1 + rightHeignt; // 中
if(node->right == nullptr && node->left) return 1 + leftHeight;
else return 1 + min(leftHeight, rightHeignt);
}
int minDepth(TreeNode* root) {
return getHeight(root);
}
};
222.二叉樹的節點個數
題目連結 文章講解 影片講解
深度優先遍歷
- 時間複雜度:o(n)
- 空間複雜度:o(logn)
class Solution {
public:
int countNodes(TreeNode* root) {
if(root == nullptr) return 0;
int leftCount = countNodes(root->left);
int rightCount = countNodes(root->right);
int result = 1 + leftCount + rightCount;
return result;
}
};
完全二叉樹
- 在完全二叉樹中,如果遞迴向左遍歷的深度等於遞迴向右遍歷的深度,那說明就是滿二叉樹。
- 滿二叉樹的節點個數為2n - 1
- 時間複雜度:o(logn × logn)
- 空間複雜度:o(logn)
class Solution {
public:
int countNodes(TreeNode* root) {
if(root == nullptr) return 0;
int leftDepth = 0;
int rightDepth = 0;
TreeNode * left = root->left;
TreeNode * right = root->right;
while(left) {
leftDepth++;
left = left->left;
}
while(right) {
rightDepth++;
right = right->right;
}
// 當前子樹為滿二叉樹,則透過計算獲得子樹的節點個數
if(leftDepth == rightDepth) return (2 << leftDepth) - 1;
else return countNodes(root->left) + countNodes(root->right) + 1;
}
};