代码随想录算法训练营第十七天 | 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和

110.平衡二叉树

题目链接 文章讲解 视频讲解
定义:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1

递归法(后序)

class Solution {
public:
    bool isBalanced(TreeNode* root) {
        if(root == nullptr) return true;
        // 求左子树高度
        int leftDepth = getDepth(root->left);  // 左
        // 求右子树高度
        int rightDepth = getDepth(root->right);  // 右
        int result = abs(leftDepth - rightDepth);  // 中
        // 如果当前节点平衡则后续遍历,求左右子树是否平衡
        if(result <= 1) {
            return isBalanced(root->left) && isBalanced(root->right);
        }
        return false;
    }
    // 求数的最大高度(后序)
    int getDepth(TreeNode* node) {
        int depth = 0;
        if(node == nullptr) return 0;
        int left = getDepth(node->left);  // 左
        int right = getDepth(node->right);  // 右
        int result = 1 + max(left, right);  // 中
        return result;
    }
};

257.二叉树的所有路径

题目链接 文章讲解 视频讲解

回溯法

思路:由于是求根节点到叶节点的路径,所以选择先序遍历
   访问根节点,并将根节点压栈
   先序遍历左子树,并将访问到的节点入栈;
   访问到叶节点时,将当前路径回收
   回溯,出栈;
   先序遍历右子树,并将访问到的节点入栈;
   访问到叶节点时,将当前路径回收
   回溯,出栈;

class Solution {
public:
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<string> result;
        vector<int> path;
        if(root == nullptr) return {};
        traversal(root, result, path);
        return result;
    }
    void traversal(TreeNode* node, vector<string>& result, vector<int>& path) {
        // 再回收路径前将当前节点添加到路径中
        path.push_back(node->val);
        // 当遍历到叶节点时,当前路径结束,回收路径
        if(node->left == nullptr && node->right == nullptr) {
            result.push_back(pathToString(path));
            return ;
        }
        // 先序遍历左子树
        if(node->left) {
            traversal(node->left, result, path);
            // 回溯
            path.pop_back();
        }
        // 先序遍历右子树
        if(node->right) {
            traversal(node->right, result, path);
            // 回溯
            path.pop_back();
        }
    }
    // 转换路径格式
    string pathToString(vector<int>& path) {
        string path_s = "";
        for(int val : path) {
            path_s += to_string(val);
            path_s += "->";
        }
        path_s.resize(path_s.size()-2);
        return path_s;
    }
};

404.左叶子之和

题目链接 文章讲解 视频讲解

左叶子节点,node->left != nullptr && node->left->left == nullptr && node->right == nullptr

class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        if(root == nullptr) return 0;
        int leftValue = 0;
        if(root->left != nullptr && root->left->left == nullptr && root->left->right == nullptr) 
            leftValue = root->left->val;
        return leftValue + sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right);
    }
};
posted @ 2024-05-24 13:55  深蓝von  阅读(9)  评论(0)    收藏  举报