程式碼隨想錄演算法訓練營第十六天 | 104.二叉樹的最大深度 111.二叉樹的最小深度 222.二叉樹的節點個數

深蓝von發表於2024-05-24

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;
    }
};

完全二叉樹

  1. 在完全二叉樹中,如果遞迴向左遍歷的深度等於遞迴向右遍歷的深度,那說明就是滿二叉樹。
  2. 滿二叉樹的節點個數為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;
    }
};

相關文章