刷题第17天 | 110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和

110. Balanced Binary Tree

题目链接:110.平衡二叉树
思路链接:代码随想录二叉树-平衡二叉树

思路

后续遍历法,中间节点通过子节点返回的高度来计算当前高度,如果左右节点高度差大于1,返回-1,之后的中间节点如果子节点高度出现-1,则中间节点高度也为-1

心路历程

心路历程

Code

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    // 递归法 后续遍历
    // height-balanced: 子节点的高度之差小于等于1
    // 需要处理的参数:当前节点;返回值:当前节点的最大高度,如果子节点高度之差大于1,返回-1
    public int isBalancedHelper(TreeNode curr) {
        if (curr == null) {
            return 0; // 高度为0
        }
        // 左
        int leftHeight = isBalancedHelper(curr.left);
        if (leftHeight == -1) {
            return -1;
        }
        // 右
        int rightHeight = isBalancedHelper(curr.right);
        if (rightHeight == -1) {
            return -1;
        }
        // 中
        if (Math.abs(leftHeight - rightHeight) > 1) {
            return -1;
        } else {
            return 1 + Math.max(leftHeight, rightHeight);
        }
    }
    
    public boolean isBalanced(TreeNode root) {
        int depth = isBalancedHelper(root);
        if (depth == -1) {
            return false;
        } else {
            return true;
        }
    }
}

257. Binary Tree Paths

题目链接:257.二叉树的所有路径
思路链接:代码随想录二叉树-二叉树的所有路径

思路

利用前序遍历,因为最终结果需要从中间节点开始记录。结束条件与之前不一样,到达叶子节点就结束,因此要在结束条件之前先把当前节点的值add到list里。在递归操作时,验证子节点是否为空,并且进行递归操作后,需要回溯,就是移除记录List的最后一个节点,也就是回退到上个节点,这是为了判断上个节点的另一个分支。

心路历程

心路历程

Code

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    // 递归法 前序遍历
    // 需要处理的参数:当前节点curr, 临时List<Integer>, result List<String>
    // 返回值:void
    public void binaryTreePathsHelper(TreeNode curr, List<Integer> paths, List<String> result) {
        // 中
        paths.add(curr.val);
        // 结束条件
        if (curr.left == null && curr.right == null) {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < paths.size() - 1; i++) {
                sb.append(paths.get(i)).append("->");
            }
            sb.append(paths.get(paths.size() - 1));
            result.add(sb.toString());
        }
        // 递归操作
        // 左
        if (curr.left != null) {
            binaryTreePathsHelper(curr.left, paths, result);
            // 回溯操作 回退到上一节点,看看有没有分叉
            paths.remove(paths.size() - 1);
        }
        // 右
        if (curr.right != null) {
            binaryTreePathsHelper(curr.right, paths, result);
            // 回溯操作 回退到上一节点,看看有没有分叉
            paths.remove(paths.size() - 1);
        }
    }
    
    public List<String> binaryTreePaths(TreeNode root) {
        List<String> result = new LinkedList<>();
        List<Integer> paths = new LinkedList<>();
        if (root == null) {
            return result;
        }
        binaryTreePathsHelper(root, paths, result);
        return result;
    }
}

Problem

题目链接:404. Sum of Left Leaves
思路链接:代码随想录二叉树-左叶子之和

思路

后续遍历,因为需要将左右子节点的左叶子之和相加,才能得到中间节点的左叶子之和。结束条件就是判断是否为叶子的条件,当前节点的左右叶子是否为空。然后是左右子节点的递归操作得到leftSum,rightSum,对于左节点来说,要判断是否左叶子节点,若是,则直接将左叶子节点的值赋给leftSum

心路历程

心路历程

Code

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int sumOfLeftLeaves(TreeNode root) {
        if (root == null) {
            return 0;
        }
        if (root.left == null && root.right == null) {
            return 0;
        }
        int leftSum = sumOfLeftLeaves(root.left);
        if (root.left != null && root.left.left == null && root.left.right == null) {
            leftSum = root.left.val;
        }
        
        int rightSum = sumOfLeftLeaves(root.right);
        int sum = leftSum + rightSum;
        return sum;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值