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

110. 平衡二叉树

给定一个二叉树,判断它是否是高度平衡的二叉树。

输入:root = [3,9,20,null,null,15,7]
输出:true

思路一:递归

  • 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。
  • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。

判断高度是否平衡,我们需要使用后序遍历,计算左子节点和右子节点的高度,如果高度差大于1则不是平衡二叉树

递归三要素:

  1. 确定参数和返回值 参数就是root,返回值可以用-1来标记不合符平衡树标准的
  2. 明确终止条件,root==null
  3. 明确单层递归的逻辑 分别递归求左子树的高度和右子树的高度,再计算高度差值
class Solution {
    public boolean isBalanced(TreeNode root) {
        return getHeight(root)!=-1;
    }
    public int getHeight(TreeNode root){
        if(root==null){
            return 0;
        }
        int leftHeight=getHeight(root.left);
        if(leftHeight==-1){
            return -1;
        }
        int rightHeight=getHeight(root.right);
        if(rightHeight==-1){
            return -1;
        }
        if(Math.abs(leftHeight-rightHeight)>1){
            return -1;
        }
        return Math.max(leftHeight,rightHeight)+1;
    }
}

思路二:迭代(思路复杂繁琐这里忽略了,后序遍历+层序遍历求高度)

257. 二叉树的所有路径、

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

输入:root = [1,2,3,null,5]
输出:["1->2->5","1->3"]

解题思路:

  1. 设置空列表保存返回结果,设置一个路径空链表保存每一条路径

  2. traversal函数迭代,迭代的参数为root,path(保存路径),reslut(保存最终结果)

    使用前序遍历首先将中间值添加到path

    迭代终止条件结点的左右子结点均为空

    设置一个StringBuilder,遍历path列表将其添加到StringBuilder中,最后将每一次遍历的路径的StringBuilder添加到最终结果reslut中。

class Solution {
     public List<String> binaryTreePaths(TreeNode root) {
        List<String> reslut=new ArrayList<>();
        if(root==null) return reslut;
        List<Integer> path=new ArrayList<>();
        traversal(root,path,reslut);
        return reslut;
    }
    public void traversal(TreeNode root,List<Integer> path,List<String> reslut){
        path.add(root.val);
        if(root.left==null&&root.right==null){
            StringBuilder sb=new StringBuilder();
            for(int i=0;i<path.size()-1;i++){
                sb.append(path.get(i)).append("->");
            }
            sb.append(path.get(path.size()-1));
            reslut.add(sb.toString());
        }
        if(root.left!=null){
            traversal(root.left,path,reslut);
            path.remove(path.size()-1);
        }
        if(root.right!=null){
            traversal(root.right,path,reslut);
            path.remove(path.size()-1);
        }
    }
}

404. 左叶子之和

给定二叉树的根节点 root,返回所有左叶子之和。

输入: root = [3,9,20,null,null,15,7] 
输出: 24 
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24

节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点

递归三要素:

  1. 确定参数和返回值 参数需要传入root,返回左节点之和int

  2. 确定终止条件 root==null即不存在左右节点

  3. 明确单层递归的逻辑

    root.left!=null&&root.left.left==null&&root.left.right==null 即为左子结点的值,我们将其分为左节点的左子节点和右结点的左子节点,分别去计算并相加。

class Solution {
    public int sumOfLeftLeaves(TreeNode root) {
        if(root==null) return 0;
        int left=sumOfLeftLeaves(root.left);
        int right=sumOfLeftLeaves(root.right);
        if(root.left!=null&&root.left.left==null&&root.left.right==null){
            left=root.left.val;
        }
       int sum=left+right;
       return sum;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值