代码随想录刷题记录day16 之 平衡二叉树+二叉树的所有路径+左叶子之和

代码随想录刷题记录day16 之 平衡二叉树+二叉树的所有路径+左叶子之和

参考:代码随想录

110. 平衡二叉树

在这里插入图片描述

思想

二叉树是否平衡的判断条件是左右子树的高度是否相差大于1

递归终止条件值 node==null 向上返回0;

再去计算左子树的高度和右子树的高度

如果左子树已经不是平衡二叉树,就会一直向上返回-1

同样 如果右子树已经不是平衡二叉树,也会一直向上返回-1

再处理中间节点,判断左右子树的高度差,决定向上返回-1还是向上返回 该节点的高度

代码
class Solution {
    public boolean isBalanced(TreeNode root) {
        //递归法
         int flag=balance(root);
         if(flag==-1) return false;

         return true;
	}

 

    public int balance(TreeNode node){
        //递归终止条件
        if(node==null) return 0;
        

        //求左子树的高度 右子树的高度
        int leftHeigth=balance(node.left);
        //如果左子树已经不是平衡二叉树了 就一直向上返回-1
        if(leftHeigth==-1) return -1;

        int rightHeight=balance(node.right);
        //如果右子树不是平衡二叉树了, 也一直向上返回-1
        if(rightHeight==-1) return -1;

        if(Math.abs(leftHeigth-rightHeight)>1){
            //不是平衡二叉树
            return -1;
        }else{
            return 1+Math.max(leftHeigth,rightHeight);
        }
    }
}

257. 二叉树的所有路径

在这里插入图片描述

思想

递归 有回溯的过程,用一个path来记录走过的路,当回退到上一个节点是,记录中对应的值也应该被删除。

例:1-2-5 到 递归返回至上一节点时,5要被弹出,再返回,2就要被弹出。

代码
class Solution {
    List<String> res=new ArrayList<>();
    public List<String> binaryTreePaths(TreeNode root) {

        List<String> path=new ArrayList<>();
        
        paths(root,path);

        return res;
    }

    public void paths(TreeNode node,List<String> path){
        path.add(String.valueOf(node.val));
        
        if(node.left==null && node.right==null) {//只需要判断叶子节点  这里如果写成node==null  就永远无法进入这个循环
            System.out.println(path);
            StringBuilder sb=new StringBuilder();
            for(int i=0;i<path.size();i++){
                if(i!=path.size()-1){
                    sb.append(path.get(i)+"->");
                }
                else{
                    sb.append(path.get(i));
                }
            }
            res.add(new String(sb));
            return ;
        }
        //单层逻辑
        if(node.left!=null){
            // path.add(String.valueOf(node.val));  //如果把添加节点值得操作写在这里  会少添加最后一个元素  因为我是判断下一个节点,不为空再添加 实际上 当前节点已经不是一个空姐点了,所以得先添加
            //回溯 删除刚刚添加的节点
            paths(node.left,path);
            path.remove(path.size()-1);
        }

        if(node.right!=null){
            // path.add(String.valueOf(node.val));
            //回溯 删除刚刚添加的节点
            paths(node.right,path);
            path.remove(path.size()-1);
        }

    }
}

404. 左叶子之和

在这里插入图片描述

思想
  • 递归

    需要通过父节点来判断子节点是否是左叶子节点,记录下来这个值

代码
public int sumOfLeftLeaves(TreeNode root) {
         //左叶子之和  遍历到叶子节点
    return leftLeaves(root);

     }

public int leftLeaves(TreeNode node){
        //递归终止条件 
        if(node==null) return 0;//当前节点是空节点  返回0
        
        if(node.left==null&& node.right==null) return 0;

        int midValue=0;
        if(node.left!=null && node.left.left==null && node.left.right==null){ //需要根据父节点来判断是否是左叶子节点
            //找到了左叶子节点 记录下来
           midValue=node.left.val;
        }

        int leftValue=leftLeaves(node.left);

        int rightValue=leftLeaves(node.right);

        return leftValue+rightValue+midValue;

    }

总结

平衡二叉树判断左右子树的高度是否大于1,用一个标记标记位来提前判断左子树和右子树是否已经不是平衡二叉树了,如果已经不是了 就一直向上返回这个标记位。在题解中这个标记位取为1

二叉树的所有路径包含了一个回溯的过程,注意需要把加入路径的那一步放到一开始,因为递归终止条件是叶子节点就向上返回。 把路径加入以后,再去递归左右子节点,回退的过程要把路径中的元素给删除了。

左叶子之和:最重要的是要用父节点去判断是否是左叶子节点。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值