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

本文介绍了LeetCode中涉及的三个二叉树相关问题:110.平衡二叉树的深度计算使用后序遍历,257.二叉树所有路径用前序遍历记录,以及404.左叶子之和的遍历策略。重点在于理解不同遍历方式在求解中的应用。
摘要由CSDN通过智能技术生成

LeetCode 110.平衡二叉树

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

但leetcode中强调的深度和高度很明显是按照结点来计算的,如图:

因为求深度可以从上往下遍历,所以需要前序遍历(中左右),而高度只能从下向上遍历,所以只能用后序遍历(左右中)。

有的同学一定疑惑,为什么104.二叉树的最大深度 (opens new window)中求的是二叉树的最大深度,也用的是后序遍历。

那是因为代码的逻辑其实是求的根节点的高度,而根节点的高度就是这棵树的最大深度,所以才可以使用后序遍历。

思路:标记左右子树高度差超过1的结点直接返回-1,不需要再继续进行下去。代码如下:

class Solution {
    public boolean isBalanced(TreeNode root) {
        if(root == null) return true;
        int height = getDepth(root);
        if(height == -1) return false;
        return true;
    }
    public int getDepth(TreeNode node){
        if(node == null) return 0;
        int leftDepth = getDepth(node.left);  // 左
        if(leftDepth == -1) return -1;
        int rightDepth = getDepth(node.right);  // 右
        if(rightDepth == -1) return -1;
        int sub = leftDepth - rightDepth;  // 中
        if(sub < -1 || sub > 1) return -1;
        return (leftDepth > rightDepth ? leftDepth : rightDepth) + 1;
    }
}

LeetCode 257. 二叉树的所有路径

思路:求根节点到叶子结点的路径,需要用前序遍历,方便让父节点指向子节点,找到对应的路径。要把路径记下来,需要回溯来回退一步路径再进入下一个路径。

代码如下:

class Solution {
    List<String> result = new ArrayList<String>();
    public List<String> binaryTreePaths(TreeNode root) {
        String path = "";
        tranversal(root,path);
        return result;
    }
    public void tranversal(TreeNode node, String s) {
        if(node == null) return;
        if(node.left == null && node.right == null) {
            result.add(new StringBuilder(s).append(node.val).toString());
            return;
        }
        String temp = new StringBuilder(s).append(node.val).append("->").toString();
        tranversal(node.left, temp);
        tranversal(node.right, temp);
    }
}

LeetCode 404.左叶子之和

本题也是简单的二叉树的遍历问题,主要把握住左叶子的定义即可,即当前根节点不为空,且左子树的左右子树为空,则说明当前节点的左子树为一个左叶子,代码如下:

class Solution {
    public int sumOfLeftLeaves(TreeNode root) {
        return transval(root);
    }
    public int transval(TreeNode node){
        if(node == null) return 0;
        int leftValue = 0;
        if(node.left != null && node.left.left == null && node.left.right == null){
            leftValue = node.left.val;
        }
        return leftValue + transval(node.left) + transval(node.right);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值