Java 求解左叶子之和

Posted 南淮北安

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 求解左叶子之和相关的知识,希望对你有一定的参考价值。

一、题目

计算给定二叉树的所有左叶子之和。
在这里插入图片描述

二、题目分析

注意题目是求所有左叶子之和

左叶子:该节点在左子树位置,同时该节点的左右子树均为空

所以只能通过父节点判断该节点是否为左叶子

if (root.left != null && root.left.left == null && root.left.right == null) {
}

三、递归法

该题对于遍历顺序没有要求,只需要遍历节点时,判断该节点的左子树节点是否是左叶子节点即可

class Solution {
    int sum = 0;

    public int sumOfLeftLeaves(TreeNode root) {
        //先序遍历求解左叶子之和
        preOrder(root);
        return sum;
    }

    public void preOrder(TreeNode root) {
        //递归终止条件
        if (root == null) {
            return;
        }
        //根据父节点判断该节点是否是左叶子
        if (root.left != null && root.left.left == null && root.left.right == null) {
            sum += root.left.val;
        }
        //先序遍历左子树
        preOrder(root.left);
        //先序遍历右子树
        preOrder(root.right);
    }
}

四、迭代法

借助栈实现先序遍历:

class Solution {
    int sum = 0;

    public int sumOfLeftLeaves(TreeNode root) {
        int sum = 0;
        if (root == null) {
            return sum;
        }
        Deque<TreeNode> deque = new LinkedList<>();
        TreeNode node;
        deque.push(root);
        while (!deque.isEmpty()) {
            node = deque.pop();
            if (node.left != null && node.left.left == null && node.left.right == null) {
                sum += node.left.val;
            }
            if (node.right != null) {
                deque.push(node.right);
            }
            if (node.left != null) {
                deque.push(node.left);
            }
        }
        return sum;
    }
}

五、总结

本题的关键就是对节点的判断

注意题目左叶子的要求:

if (root.left != null && root.left.left == null && root.left.right == null) {
}

以上是关于Java 求解左叶子之和的主要内容,如果未能解决你的问题,请参考以下文章

二叉树:做了这么多题目了,我的左叶子之和是多少?

二叉树16:左叶子之和

404. 左叶子之和

404. 左叶子之和

leetcode 404. 左叶子之和

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