【KOKO-代码随想录算法训练营Day 17 |110|257|404】

KOKO-代码随想录算法训练营Day17 | 110| 257| 404



一、110.平衡二叉树

1.题目

2.代码

public boolean isBalanced(TreeNode root) {
        if(root==null){
            return true;
        }
        int len=getHeight(root);
        return len==-1?false:true;
    }

    private int getHeight(TreeNode root) {
        if(root==null){
            return 0;
        }
        int left=getHeight(root.left);
        if(left==-1){
            return -1;
        }
        int right=getHeight(root.right);
        if(right==-1){
            return -1;
        }
        int res;
        if(Math.abs(left-right)>1){
            res=-1;
        }else {
            res=1+Math.max(left,right);//取高度
        }
        return res;
    }

3.总结

后序遍历就是从叶子节点开始,计算高度,left=getHeight();就是第一个最左侧的叶子节点的值已记录,回到了该叶子节点处,然后取右叶子节点的子节点,收获值后再在左侧第一个叶子节点处比较取得最大值后向上传递。
节点处收获比较值。

二、257. 二叉树的所有路径

1.题目

2.代码

public List<String> binaryTreePaths(TreeNode root) {
        List<String> res= new ArrayList<>();
        List<Integer> list=new ArrayList<>();
        getPath(root,res,list);
        return res;
    }
    private void getPath(TreeNode root, List<String> res, List<Integer> sb) {
        sb.add(root.val);
        if(root.left==null&&root.right==null){
            //收集节点
            String temp="";
            for (int i = 0; i <sb.size()-1 ; i++) {
                temp=temp+sb.get(i)+"->";
            }
            temp+=sb.get(sb.size()-1);
            res.add(temp);
            return;
        }
        if(root.left!=null){
            getPath(root.left,res,sb);
            sb.remove(sb.size()-1);
        }
        if(root.right!=null){
            getPath(root.right,res,sb);
            sb.remove(sb.size()-1);
        }
    }

3.总结

回溯就是在递归后做的操作,是终止条件满足后的下一步操作,即终止节点的上一个节点。
叶子节点判断方法:
root!null&&root.leftnull&&root.right==null;

三. 404.左叶子之和

1.题目:

2.代码:

public static int sumOfLeftLeaves(TreeNode root) {
        return getLeftSum(root);
    }

    private static int getLeftSum(TreeNode root) {
        if(root==null){
            return 0;
        }
        if(root.left==null&&root.right==null){
            return 0; //叶子节点获取下面的值为0,
        }
        int left=getLeftSum(root.left);//是左叶子节点了,0到叶子节点
        if(root.left!=null&&root.left.left==null&&root.left.right==null){
            left=root.left.val;
        }
        int right=getLeftSum(root.right);
        return left+right;
    }

3.总结:

要判断一个节点是不是左叶子节点,需要根据父节点去判断,即root.left!=null&&root.left.leftnull&&root.left.rightnull;
右子树只需把节点传入即可。左子树也只需把节点传入即可,即在父节点处收集。

总结

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值