day-17 代码随想录算法训练营(19)二叉树 part04 已二刷

110.平衡二叉树

分析:判断每个节点的左右子树的高度差小于等于1;所以首先需要求左右子树高度,再在父节点进行判断,故此采用后序遍历。
思路:后序遍历二叉树,从底部递归回来时加上高度
class Solution {
public:
    int judge(TreeNode*root){
        if(root==nullptr)
            return 0;
        int hl=judge(root->left);
        if(hl==-1) return -1;

        int hr=judge(root->right);
        if(hr==-1) return -1;

        if(abs(hr-hl)>1) return -1;

        return 1+max(hr,hl);
    }
    bool isBalanced(TreeNode* root) {
        //思路二:递归遍历每一个节点的左右子树高度,判断是否差值小于等于1
        if(root==nullptr)
            return true;
        return judge(root)==-1?false:true;
    }
二刷路过 

257.二叉树的所有路径

思路:要找到每一个叶子节点,并且加上一路上的值,使用前序遍历;在遍历到left和right为空时添加路径
class Solution {
public:
    vector<string>nodes;
    void judge(TreeNode*root,string mid)
    {
        if(root==nullptr)
            return;
        if(!mid.empty())//当mid中有值时
            mid+="->";
        mid+=to_string(root->val);
        if(root->left==nullptr && root->right==nullptr)
            nodes.push_back(mid);
        judge(root->left,mid);
        judge(root->right,mid);
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        //这题需要从根结点开始遍历且加上val值,所以采用前序遍历
        string mid="";
        judge(root,mid);
        return nodes;
    }
};
 二刷路过:
class Solution {
public:
    vector<string>res;//结果数组
    string midchar="->";
    void judge(TreeNode*root,string mid){
        if(!mid.empty()) mid+=midchar;//箭头符号
        mid+=to_string(root->val);
        if(root->left==nullptr && root->right==nullptr){//叶子节点
            res.push_back(mid);
            return;
        }
        if(root->left) judge(root->left,mid);
        if(root->right) judge(root->right,mid);
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        string mid="";
        judge(root,mid);
        return res;

    }
};

 

404.左叶子之和

 思路:直接递归遍历,判断到左叶子节点计数
class Solution {
public:
    int count=0;
    void judge(TreeNode*root,bool dis){//dis用来判断是左子节点还是右子节点
        if(root==nullptr)
            return;
        if(root->left==nullptr && root->right==nullptr && dis)//当该节点是左叶子节点时
            count+=root->val;
        judge(root->left,true);
        judge(root->right,false);
    }
    int sumOfLeftLeaves(TreeNode* root) {

        if(root->left==nullptr && root->right==nullptr)//考虑只有一个节点的情况
            return 0;
        judge(root,true);
        return count;
    }
};
二刷:bool 变量判断左右节点
class Solution {
public:
    int res=0;
    void judge(TreeNode*root,bool flag){//ture为左  false为右
        if(root->left==nullptr && root->right==nullptr){//叶子节点
            if(flag) res+=root->val;//左叶子
            return;
        }
        if(root->left) judge(root->left,true);
        if(root->right) judge(root->right,false);        
    }
    int sumOfLeftLeaves(TreeNode* root) {
        judge(root,false);
        return res;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值