程式碼隨想錄演算法訓練營第十五天| 110.平衡二叉樹,257. 二叉樹的所有路徑, 404.左葉子之和, 222.完全二叉樹的節點個數

W-Vicky11發表於2024-11-08

110.平衡二叉樹

文章連結:https://programmercarl.com/0110.平衡二叉樹.html#題外話
題目連結:https://leetcode.cn/problems/balanced-binary-tree/description/

class Solution {
public:
    //每次都要比較左右子樹的高度差是否在1以內,所以遞迴是要統計子樹的高度的
    int getHeight(TreeNode* root){
        if(root==NULL) return 0;
        //獲得左子樹的高度,如果左子樹高度為-1,說明已經失敗了
        int leftHeight=getHeight(root->left);
        if(leftHeight==-1) return -1;
        //獲得右子樹的高度,如果右子樹高度為-1,說明已經失敗了
        int rightHeight=getHeight(root->right);
        if(rightHeight==-1) return -1;
        //如果左右子樹的高度都不為-1,說明可以進行高度差的比較,判斷是否在1以內
        if(abs(leftHeight-rightHeight)>1) return -1;
        //如果以上失敗條件都能排除,則可以返回父節點的高度
        return 1+max(leftHeight,rightHeight);
    }
    bool isBalanced(TreeNode* root) {
        if(getHeight(root)==-1) return false;
        return true;
    }
};

257. 二叉樹的所有路徑

文章連結:https://programmercarl.com/0257.二叉樹的所有路徑.html
題目連結:https://leetcode.cn/problems/binary-tree-paths/description/

class Solution {
    void traversal(TreeNode* node,string path,vector<string>&result){
        //這裡一開始要加上葉子節點
        path+=to_string(node->val);
        //再處理葉子節點的情況
        if(node->right==NULL&&node->left==NULL){
            result.push_back(path);
            return;
        }
        //左
        if(node->left) traversal(node->left,path+"->",result);
        //右
        if(node->right) traversal(node->right,path+"->",result);
    }
public:
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<string> result;
        string path;
        if(root==NULL) return {};
        traversal(root,path,result);
        return result;
    }
};

404.左葉子之和

文章連結:https://programmercarl.com/0404.左葉子之和.html
題目連結:https://leetcode.cn/problems/sum-of-left-leaves/description/

class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        if(root==NULL) return 0;
        int leftNum=0;
        //不斷向下遍歷,直到遇到符合條件的(左孩子為葉子節點)左葉子節點和的值才會增加
        if(root->left!=NULL&&root->left->left==NULL&&root->left->right==NULL){
            leftNum+=root->left->val;
        }
        return leftNum+sumOfLeftLeaves(root->left)+sumOfLeftLeaves(root->right);
    }
};

222.完全二叉樹的節點個數

文章連結:https://programmercarl.com/0222.完全二叉樹的節點個數.html
題目連結:https://leetcode.cn/problems/count-complete-tree-nodes/

總結:直接做一個遍歷即可

class Solution {
public:
    int countNodes(TreeNode* root) {
        if(root==NULL) return 0;
        return 1+countNodes(root->left)+countNodes(root->right);
    }
};

相關文章