力扣刷题||L110.平衡二叉树 、L257. 二叉树的所有路径 、L404.左叶子之和

文章讲述了如何使用递归解决三种不同的二叉树问题:检查是否为平衡二叉树,获取所有路径,以及计算左叶子之和。在平衡二叉树问题中,采用了后序遍历;二叉树路径问题利用前序遍历和回溯;左叶子之和问题通过递归遍历实现。
摘要由CSDN通过智能技术生成

L110.平衡二叉树https://leetcode.cn/problems/balanced-binary-tree/

本题应先理解什么是平衡二叉树,每个叶子节点的左子树与右子树的高度之差不大于一

运用递归三部曲,其实也就是时刻判断,每个叶子节点的左子树与右子树的高度之差,若大于1则返回false,若不大,则返回则准确高度,以便根节点的进行一个求解。

1、返回类型,用-1代表false,用实际深度代表true

2、终止条件,遇到空就返回null。

3、循环体,在每个根节点传入时,判断左子树与右子树的的返回值,若为-1,则立刻跳出循环,若不是,则继续

class Solution {
public:
    int getdepth(TreeNode* root)
    {
        //采用后序遍历方式
        if (root == NULL)return 0;
        int leftdepth = getdepth(root->left);
        if (leftdepth == -1)return -1;
        int rightdepth = getdepth(root->right);
        if (rightdepth == -1)return -1;
        int result = 1 + max(leftdepth, rightdepth);
        if (abs(leftdepth - rightdepth) > 1)
            return -1;
        else
            return result;
    }
    bool isBalanced(TreeNode* root) {
        return getdepth(root)==-1?false:true;
    }
};

L257. 二叉树的所有路径257. 二叉树的所有路径 - 力扣(LeetCode)

本题返回所有路径之和,自己一开始未搞清二叉树的前中后三种遍历方式,导致一直犯迷糊

本题的思路,看卡哥的是用到了回溯,因为是从第一个根节点,来返回所有的路径,所以在这使用前序遍历,当遍历到最后一个叶子节点时,条件判断为左右孩子节点都为空,这样就将其加入其中。

若不为空,path就加一个"->”,并开始新一轮递归,直到找到叶子节点,找到之后,因为在这并没有采用引用的方式进行引用标量,故传入的path值时一个局部变量,并不会改变上一级的值,虽然在本轮函数中已经加了一个value值,但在上一轮中末端还是“->”。

class Solution {
public:
    //本题应该采用前序遍历方式,中左右,采用递归方式
    void  recursion(vector<string>& result, TreeNode* root,string path)
    {
        path += to_string(root->val);
        if (root->left == NULL && root->right == NULL)
        {
            result.push_back(path);
            return;
        }
        if (root->left)//若不为空,则加->
        {
            path += "->";
            recursion(result, root->left, path);//一直忘下面寻找,找到返回为空,就将->第一个的弹出
            path.pop_back();
            path.pop_back();
        }
        if (root->right)//若不为空,则加->
        {
            path += "->";
            recursion(result, root->right, path);
            path.pop_back();
            path.pop_back();
        }
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<string>result;
        string path;
        if (root == NULL)return result;
        recursion(result, root, path);
        return result;
    }
};

L404.左叶子之和 404. 左叶子之和 - 力扣(LeetCode)

本题给自己的体会就是多动手写

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值