首页 > 编程语言 >算法刷题 Day 17 | 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和

算法刷题 Day 17 | 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和

时间:2023-01-16 00:23:44浏览次数:62  
标签:node result return 17 int vec 二叉树 257 left

今日内容:

  • 平衡二叉树
  • 二叉树的所有路径
  • 左叶子之和

详细布置

迭代法,大家可以直接过,二刷有精力的时候 再去掌握迭代法。

110.平衡二叉树 (优先掌握递归)

再一次涉及到,什么是高度,什么是深度,可以巩固一下。

题目链接/文章讲解/视频讲解:https://programmercarl.com/0110.%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91.html

Tips:这道题的思路就是求取左右子树的高度以及高度差,如果高度差大于等于1的话,就返回-1作为标记。

我的题解:

class Solution {
public:
    int getHeight(TreeNode* node){
        if(node == NULL){
            return 0;
        }

        int left = getHeight(node->left);
        int right = getHeight(node->right);
        int diff = abs(left - right);

        if(left == -1 || right == -1 || diff > 1){
            return -1;
        }
        else{
            return max(left,right) + 1;
        }
        
    }
    bool isBalanced(TreeNode* root) {
        int result = getHeight(root);
        if(result == -1){
            return false;
        }
        else{
            return true;
        }
    }
};

257. 二叉树的所有路径 (优先掌握递归)

这是大家第一次接触到回溯的过程, 我在视频里重点讲解了 本题为什么要有回溯,已经回溯的过程。

如果对回溯 似懂非懂,没关系, 可以先有个印象。

题目链接/文章讲解/视频讲解:https://programmercarl.com/0257.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%89%80%E6%9C%89%E8%B7%AF%E5%BE%84.html

Tips:这道题使用vector来记录路径,result来保存结果,需要注意对NULL节点的判断移到了进入递归函数之前,以及对int转字符串可以用to_string()函数

我的题解:

class Solution {
public:
    void traversal(TreeNode* node, vector<int>& vec, vector<string>& result){
        vec.push_back(node->val);
        if(node->left == NULL && node->right == NULL){
            string str;
            for(int i = 0; i<vec.size() - 1; i++){
                str += to_string(vec[i]);
                str += "->";
            }
            str += to_string(vec[vec.size() -1]);
            result.push_back(str);
        }
        if(node->left){
            traversal(node->left, vec, result);
            vec.pop_back();
        }
        if(node->right){
            traversal(node->right, vec, result);
            vec.pop_back();
        }
    }

    vector<string> binaryTreePaths(TreeNode* root) {
        vector<string> result;
        vector<int> vec;
        if(root == NULL) return result;
        traversal(root, vec, result);
        return result;
    }
};

404.左叶子之和 (优先掌握递归)

其实本题有点文字游戏,搞清楚什么是左叶子,剩下的就是二叉树的基本操作。

题目链接/文章讲解/视频讲解:https://programmercarl.com/0404.%E5%B7%A6%E5%8F%B6%E5%AD%90%E4%B9%8B%E5%92%8C.html

Tips:这题思路比较简单,只要想清楚对左叶子节点的判断要在其父节点处完成即可。

我的题解:

class Solution {
public:
    int findLeft(TreeNode* node){
        int sum = 0;
        if(node == NULL){
            return 0;
        }
        if(node->left && !node->left->left && !node->left->right){
            sum += node->left->val;
        }
        return sum + findLeft(node->left) + findLeft(node->right);
    }
    int sumOfLeftLeaves(TreeNode* root) {
        int sum = 0;
        return findLeft(root);
    }
};

标签:node,result,return,17,int,vec,二叉树,257,left
From: https://www.cnblogs.com/GavinGYM/p/17054527.html

相关文章