leetcode_404

news/2024/6/29 12:17:39 标签: leetcode, 二叉树, 遍历, 递归, bfs

一,题目大意
给出一个二叉树,求出这个二叉树所有左叶子节点的和。

二、分析:这是一道二叉树的题目,对于二叉树的问题,很多都可以用遍历的思想解决。

1,二叉树DFS遍历递归,非递归),在我的另一篇里有详细的介绍。
2,二叉树BFS遍历,本文主要介绍的类容。
3,利用遍历的思想解决这个问题。
4,如何判断一个节点是左叶子节点(解决这个问题的核心):对于一个节点root,root.left不为空,且 root.left.letf、root.left.right为空,则root.left这个节点是左叶子节点。

三,DFS解决:
1,DFS的介绍:具体介绍在另一篇文章里面:

二叉树DFS遍历

2,解决这个问题:

public static int sumOfLeftLeaves(TreeNode root) {
        int sum = 0;
        Stack<TreeNode> stack = new Stack<TreeNode>();//实现遍历
        while(root != null || !stack.isEmpty()) {
            while (root != null) {
                stack.push(root);
                root = root.left;
            }
            if(!stack.isEmpty()) {
                root = stack.pop();
                if(root.left != null && root.left.left == null && root.left.right == null) {//左节点的判断
                    sum += root.left.n;//把左节点加起来
                }
                root = root.right;
            }
        }
        return sum;
    }

四,BFS解决
1,BFS遍历:利用队列,先把根节点放入队列;从队列取一个节点root访问,把root.left,root.right放入队列;直到队列为空。以打印为例:

public static void printDFS(TreeNode root) {
        Queue<TreeNode> queue = new ArrayBlockingQueue<TreeNode>(20);//对列
        if(root != null) {
            queue.add(root);//放入根节点
        }
        while(!queue.isEmpty()) {
            root = queue.remove();//从队列节点取
            System.out.print(root.n + " ");//访问操作
            if(root.left != null)//放入左孩子
                queue.add(root.left);
            if(root.right != null)//放入右孩子
                queue.add(root.right);
        }
    }

2,解决这个问题:

public static int sumOfLeftLeaves(TreeNode root) {
        int sum = 0;
        Queue<TreeNode> queue = new ArrayBlockingQueue<TreeNode>(20);
        if(root != null) {
            queue.add(root);
        }
        while(!queue.isEmpty()) {
            root = queue.remove();
            if(root.left != null && root.left.left == null && root.left.right == null) {//改变了访问节点的操作
                sum += root.left.n;
            }
            if(root.left != null)
                queue.add(root.left);
            if(root.right != null)
                queue.add(root.right);
        }
        return sum;
    }

五,递归解决这个问题

public static int sumOfLeftLeaves3(TreeNode root) {
        if(root==null) 
            return 0;
        else if(root.left!=null && root.left.left==null && root.left.right==null) 
            return root.left.n+sumOfLeftLeaves(root.right);
        else 
            return sumOfLeftLeaves(root.left)+sumOfLeftLeaves(root.right);
    }

http://www.niftyadmin.cn/n/1435129.html

相关文章

leetcode_453

一、题目大意&#xff1a; 给定一个非空数组&#xff08;长度为n&#xff09;&#xff0c;每次“移动”只能对数组中n-1个元素都加一&#xff0c;问经过多少次移动&#xff0c;数组的元素能完全一样 二、分析 1&#xff0c;正向理解&#xff1a;每次把最小的n-1个数加一&…

leetcode_383(不定顺序判断是否模式)

一、题目大意&#xff08;这是一道字符串的题目&#xff09; 判断给定字符串Ransom 能否由另一字符串magazine中字符中的某些字符组合生成。magazine中的字符只能出现一次。 二、分析 1&#xff0c;正向解决&#xff1a;Ranson中的字符判断magazine中是否有&#xff1b;若有…

leetcode_349(找两个集合的交集)

一、题目大意 已知两个数组&#xff0c;写一个函数来计算它们的交集。提示&#xff1a;不能重复出现&#xff0c;不要求顺序。 二、分析&#xff1a; 1&#xff0c;解题思想&#xff1a;两个数字A,B。把A&#xff0c;B中的都出现的放到另一个数组中。为了不重复&#xff0c;…

leetcode_100(Same Tree)

一、题目大意&#xff1a; 判断两个二叉树是否相同&#xff0c;即是判断两个二叉树的结构和值是否相等。 二、分析&#xff1a; 对于二叉树的问题很多可以转换为遍历的问题。二叉树的遍历可以是深度优先&#xff0c;也可以是广度优先。深度优先又可以分为中根、先根、后根遍…

leetcode_387(字符串题目总结)

一&#xff0c;题目大意&#xff1a; 找到字符串中没有重复的字符&#xff0c;并且这个字符是第一个出现的。 二、字符串题目条件&#xff1a; 输入的字符全部是小写&#xff0c;所以大小写区分这些问题就不用考虑了。 三、分析这类题目&#xff1a; 1&#xff0c;解题的方…

取出数字的每一个字符

一、大意&#xff1a; 这个问题很简单&#xff0c;就是把一个数字的每个字符分离开来。 二、问题变形&#xff1a; 1&#xff0c;逆操作&#xff1a;知道每个字符和位置&#xff0c;求这个数 2&#xff0c;leetcode171&#xff1a;给定一个像Excel表格里显示的列标题&#…

leetcode_169(主元素查找)

一、题目大意&#xff1a; 给定size 为n的数组&#xff0c;查找出主元素&#xff0c;就是出现次数大于n/2次的元素。你可以假定数组非空&#xff0c;而且主元素一定存在。 二、分析 1&#xff0c;不难想到&#xff0c;出现半数以上的元素最多只有一个。 2&#xff0c;选出出…

leetcode_350(求两个数组的交集)

一&#xff0c;题目大意 给定两个数组&#xff0c;编写函数计算它们的交集。 注意&#xff1a; 结果中的每个元素的出现次数应与其在两个数组中同时出现的次数一样多。 结果可以采用任意顺序。 进一步思考&#xff1a; 如果数组已经排好序&#xff0c;怎样优化你的算法&a…