代码随想录算法训练营第十四天 | 110.平衡二叉树、257. 二叉树的所有路径 、404.左叶子之和、 222.完全二叉树的节点个数

1. 题目:平衡二叉树

class Solution {

public:

    // 返回以该节点为根节点的二叉树的高度,如果不是平衡二叉树了则返回-1

    int getHeight(TreeNode* node) {

        if (node == NULL) {

            return 0;

        }

        int leftHeight = getHeight(node->left);

        if (leftHeight == -1) return -1;

        int rightHeight = getHeight(node->right);

        if (rightHeight == -1) return -1;

        return abs(leftHeight - rightHeight) > 1 ? -1 : 1 + max(leftHeight, rightHeight);

    }

    bool isBalanced(TreeNode* root) {

        return getHeight(root) == -1 ? false : true;

    }

};

2. 题目:二叉树的所有路径

/**

 * Definition for a binary tree node.

 * struct TreeNode {

 *     int val;

 *     TreeNode *left;

 *     TreeNode *right;

 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}

 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}

 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}

 * };

 */

class Solution {

private:

    void traversal(TreeNode* cur, vector<int>& path, vector<string>& result) {

        path.push_back(cur->val); // 中,中为什么写在这里,因为最后一个节点也要加入到path中

        // 这才到了叶子节点

        if (cur->left == NULL && cur->right == NULL) {

            string sPath;

            for (int i = 0; i < path.size() - 1; i++) {

                sPath += to_string(path[i]);

                sPath += "->";

            }

            sPath += to_string(path[path.size() - 1]);

            result.push_back(sPath);

            return;

        }

        if (cur->left) { // 左

            traversal(cur->left, path, result);

            path.pop_back(); // 回溯

        }

        if (cur->right) { // 右

            traversal(cur->right, path, result);

            path.pop_back(); // 回溯

        }

    }

public:

    vector<string> binaryTreePaths(TreeNode* root) {

        vector<string> result;

        vector<int> path;

        if (root == NULL) return result;

        traversal(root, path, result);

        return result;

    }

};

3. 题目:求左叶子值之和

class Solution {

public:

    int sumOfLeftLeaves(TreeNode* root) {

        if (root == NULL) return 0;

        if (root -> left == NULL && root -> right == NULL) return 0;

        int leftValue = sumOfLeftLeaves(root -> left); // 左

        if(root -> left && !root->left->left && !root->left->right){

            leftValue = root->left->val;

        }

        int rightValue = sumOfLeftLeaves(root->right); // 右

        int sum = leftValue + rightValue; // 中

        return sum;

    }

};

4. 题目:完全二叉树节点个数

class Solution {

public:

    int getNodesNum(TreeNode* cur) {

        if(cur == NULL) return 0;

        int leftNum = getNodesNum(cur -> left);

        int rightNum = getNodesNum(cur -> right);

        int treeNum = leftNum + rightNum + 1;

        return treeNum;

    }

    int countNodes(TreeNode* root) {

        return getNodesNum(root);

    }

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值