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

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

详细布置

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

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

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

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

/**
 * 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 {
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;

        int result;
        if(abs(leftheight-rightheight)>1)
        {
            return -1;
        }
        else return 1+max(leftheight,rightheight);// 以当前节点为根节点的树的最大高度
    }

    bool isBalanced(TreeNode* root) {
        return getheight(root)!=-1?true:false;
    }
};

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

/**
 * 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 {
public:
    void traversal(TreeNode *node,vector<int>&path,vector<string>&result)
    {
        path.push_back(node->val);// 中,中为什么写在这里,因为最后一个节点也要加入到path中
        if(node->left==NULL&&node->right==NULL)// 遇到叶子节点
        {
            string spath;
            for(int i=0;i<path.size()-1;i++)// 将path里记录的路径转为string格式
            {
                spath+=to_string(path[i]);
                spath+="->";
            }
            spath+=to_string(path[path.size()-1]);// 记录最后一个节点(叶子节点)
            result.push_back(spath);
            return;

        }

        if(node->left)//左
        {
            traversal(node->left,path,result);
            path.pop_back();//回溯
        }
        
        if(node->right)//右
        {
            traversal(node->right,path,result);
            path.pop_back();//回溯
        }

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

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

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

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

/**
 * 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 {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        if(root==NULL)
        return 0;
        if(root->left==NULL&&root->right==NULL)
        return 0;

        int leftnum=sumOfLeftLeaves(root->left);//左
        if(root->left!=NULL&&root->left->left==NULL&&root->left->right==NULL)//左
         leftnum=root->left->val;
        int rightnum=sumOfLeftLeaves(root->right);//右

        return leftnum+rightnum;//中--------返回所有左叶子的值


    }
};

你可能感兴趣的:(算法,c++)