立志重刷代码随想录60天冲冲冲!!——第十五天

222.完全二叉树的节点个数

直写了通用方法。

class Solution {
public:
    int TreeNodeNum(TreeNode* node) {
        if (node == nullptr) return 0;

        // 后序遍历!!左右中
        int leftnum = TreeNodeNum(node->left);
        int rightnum = TreeNodeNum(node->right);
        int sum = leftnum + rightnum + 1;

        return sum;
    }

    int countNodes(TreeNode* root) {
        int res = TreeNodeNum(root);
        return res;
    }
};

110.平衡二叉树

后序

若高度为-1,则一直返回-1

逻辑判断:若绝对值大于1,返回-1;否则返回左右高度的最大值➕1

class Solution {
public:
    int getheight(TreeNode* node) {
        // 后序 左右中,重点看“中”的逻辑
        if (node ==nullptr) return 0;
        int leftheight = getheight(node->left);
        if (leftheight == -1) return -1;
        int rightheight = getheight(node->right);
        if (rightheight == -1) return -1;

        int results;
        if (abs(leftheight - rightheight) > 1) return -1;
        else {
            results = max(leftheight, rightheight) + 1;
        }
        return results;
    }
    bool isBalanced(TreeNode* root) {
        int height = getheight(root);
        return height >= 0 ? true: false;
    }
};

257. 二叉树的所有路径

用到回溯

需要注意:先把“中”推入,保证第一个节点进入结果

class Solution {
public:
    void traversal (TreeNode* node, vector<int>& path, vector<string>& results) {
        path.push_back(node->val); // 中
        if (node->left == nullptr && node->right == nullptr) {
            string sPath;
            for (int i = 0; i < path.size() - 1; i++) {
                sPath += to_string(path[i]);
                sPath += "->";
            }
            sPath += to_string(path.back());
            results.push_back(sPath);
            return;
        }

        if (node->left) {
            traversal(node->left, path, results);
            path.pop_back(); // pop_back()
        }
        if (node->right) {
            traversal(node->right, path, results);
            path.pop_back();
        }
    }

    vector<string> binaryTreePaths(TreeNode* root) {
        vector<int> path;
        vector<string> results;
        traversal(root, path, results);
        return results;
    }
};

404.左叶子之和

可以不写副函数

左孩子存在,左孩子的左孩子不存在,左孩子的右孩子不存在:left = node->left->val;

class Solution {
public:
    int GetLeft (TreeNode* node) {
        if (node == nullptr) return 0;

        int left = GetLeft(node->left);
        if (node->left != nullptr && node->left->left == nullptr && node->left->right == nullptr) {
            left = node->left->val;
        }
        int right = GetLeft(node->right);
        int sum = left + right;
        return sum;
    }

    int sumOfLeftLeaves(TreeNode* root) {
        int sum = GetLeft(root);
        return sum;
    }
};

代码随想录更新 文章被收录于专栏

冲冲冲冲冲冲!

全部评论

相关推荐

榕城小榕树:你别说,你还真别说,计算机实习薪资跟这个差不多
点赞 评论 收藏
分享
小小梦想家l:图片没加载出来给我整的心都凉了,现在心暖暖的
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务