目录

1、求叶子节点之和

2、求叶子节点的父节点之和

3、求左叶子节点 leetcode404

4、层数最深叶子节点之和leetcode1302

5、层数最浅叶子节点之和

6、删除给定值的叶子节点leetcode1325


叶子节点:没有子节点的节点。

1、求叶子节点之和

本题的核心在于找出二叉树的叶子节点:本节点的左右子节点均为null

    public static int sumLeafNode(TreeNode root){if(root == null){return 0;}if(root.left == null && root.right == null){//叶子节点return root.val;}return sumLeafNode(root.left) + sumLeafNode(root.right);} 

2、求叶子节点的父节点之和

本题的核心在于找出叶子节点的父节点:左子节点为叶节点或者右子节点为叶子节点。

    public static int sumParentOfLeafNode(TreeNode root){if(root == null){return 0;}int parentOfLeafVal = 0;//叶子节点的父节点:左子节点为叶节点或者右子节点为叶子节点if((root.left != null && root.left.left == null && root.left.right == null)||(root.right != null && root.right.left == null && root.right.right == null)){parentOfLeafVal = root.val;}return parentOfLeafVal + sumParentLeafNode(root.left)+sumParentOfLeafNode(root.right);}

       有一点需要特别说明的是找到叶父节点时不能返回,否则会遗漏左右子树其中的一支。记住以下这个简单的例子:3、20两个均是叶子节点的父节点

    3/ \9  20/  \15   7

3、求左叶子节点 leetcode404

本题的核心在于找出二叉树的左叶子节点:该节点的左子节点是叶节点,Y:取出左叶子节点的值;N:访问整个左子树

递归代码如下:

    public int sumOfLeftLeaves(TreeNode root) {int leftVal = 0;if(root == null){return 0;}//该节点的左子节点为叶节点if((root.left != null && root.left.left == null && root.left.right == null)){leftVal = root.left.val;//取出左叶子节点的值,注意此处不能直接返回,否则该节点的右子树无法访问}else{leftVal = sumOfLeftLeaves(root.left);//该节点的左子节点为不是叶节点,访问左子树}return leftVal + sumOfLeftLeaves(root.right);}

4、层数最深叶子节点之和leetcode1302

DFS:递归到叶节点,由于需要求出最深叶子节点,递归时需要将层数传递下去,与当前最深层数进行比较、更新等操作。

class Solution {int maxDeepth = 0;int sumDeepestLeaves = 0;public int deepestLeavesSum(TreeNode root) {deepestLeavesSum(root,0);return sumDeepestLeaves;}public void deepestLeavesSum(TreeNode root,int deepth) {if(root == null){return ;}if(root.left == null && root.right == null){//叶子节点if(deepth == maxDeepth){sumDeepestLeaves += root.val;} else if(deepth > maxDeepth){maxDeepth = deepth;sumDeepestLeaves = root.val;}else{}  }deepestLeavesSum(root.left,deepth + 1);deepestLeavesSum(root.right,deepth + 1);}
}

BFS:采用广度搜索对树进行逐层遍历,求出最后一层即最深叶子节点之和即可。特别说明:涉及到二叉树的层级时必须要考虑到BFS

    public int deepestLeavesSum(TreeNode root) {if(root == null){return 0;}Queue<TreeNode> queue = new LinkedList<>();queue.add(root);int sum = 0;while(!queue.isEmpty()){int lineLen =  queue.size();sum = 0;for(int i = 0; i < lineLen; i++){TreeNode node = queue.poll();sum += node.val;//求每一层节点之和if(node.left != null){queue.add(node.left);}if(node.right != null){queue.add(node.right);}}}return sum;}

5、层数最浅叶子节点之和

DFS:访问叶子节点时比较、更新最浅层数 minDeepth ,当访问的层数大于 minDeepth 时直接返回,不再继续递归遍历。

 int minDeepth = 10000;int sumShallowestLeaves = 0;public int shallowestLeavesSum(TreeNode root) {shallowestLeavesSum(root,0);return sumShallowestLeaves;}public void shallowestLeavesSum(TreeNode root,int deepth) {if(root == null || deepth > minDeepth){//当层数大于当前最小层数直接返回return ;}if(root.left == null && root.right == null){//叶子节点if(deepth < minDeepth){minDeepth =  deepth;sumShallowestLeaves = root.val;  }else if(deepth == minDeepth){sumShallowestLeaves += root.val;  }else{}}shallowestLeavesSum(root.left,deepth + 1);shallowestLeavesSum(root.right,deepth + 1);}  

BFS:求到最浅一层叶子节点时结束循环

 public int shallowestLeavesSum(TreeNode root) {if(root == null){return 0;}Queue<TreeNode> queue = new LinkedList<>();queue.add(root);int sum = 0;while(!queue.isEmpty()){int lineLen =  queue.size();sum = 0;boolean cycleOver = false;for(int i = 0; i < lineLen; i++){TreeNode node = queue.poll();if(node.left == null && node.right == null){sum += node.val; // 求到第一层有子节点cycleOver = true;// 本层叶子节点结束后,结束循环}if(node.left != null){queue.add(node.left);}if(node.right != null){queue.add(node.right);}}if(cycleOver) break;}return sum;}

6、删除给定值的叶子节点leetcode1325

给你一棵以 root 为根的二叉树和一个整数 target ,请你删除所有值为 target 的 叶子节点 。注意,一旦删除值为 target 的叶子节点,它的父节点就可能变成叶子节点;如果新叶子节点的值恰好也是 target ,那么这个节点也应该被删除。也就是说,你需要重复此过程直到不能继续删除。实例如下,target = 2:

本题的难点:在于删除叶节点后,原来的叶子节点的父节点可能变成新的叶子节点,因此必须采用后序的遍历的方法,先操作左右子树,再操作自己。

递归实现:

    public TreeNode removeLeafNodes(TreeNode root, int target) {if(root == null){return null;}root.left = removeLeafNodes(root.left,target);root.right = removeLeafNodes(root.right,target);if(root.left == null && root.right == null && root.val == target){return null;}else{return root;}}

进阶:迭代实现 

二叉树:叶节点的一些操作相关推荐

  1. java计算二叉树的节点最小值_java计算二叉树的高度以及叶节点个数

    java实现二叉树的相关操作 代码如下 package 二叉树有关; import java.util.ArrayDeque; import java.util.Queue; public class ...

  2. Java创建遍历二叉树(递归)并求树高及叶节点个数(代码全)

    在学习树的操作之后,我们就可以对数这种数据结构进行创建和使用了,话不多说,直接上代码 PS:为了代码复用和通用性,采用接口然后打包了整个工程,存储数据定义为泛型 一.接口及链结点定义 package ...

  3. LeetCode 742. 二叉树最近的叶节点(建立父节点信息+BFS)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个 每个结点的值互不相同 的二叉树,和一个目标值 k,找出树中与目标值 k 最近的叶结点. 这里,与叶结点 最近 表示在二叉树中到达该叶节点需要行进 ...

  4. 二叉树-求叶节点个数

    对任何一棵二叉树:度为0的结点数(即叶节点) = 度为2的节点数 + 1: 当二叉树的总个数为奇数时,此二叉树"无度为1"的结点 当二叉树的总个数为偶数时,此二叉树"只有 ...

  5. Leetcode 129求根节点到叶节点数字之和、104二叉树的最大深度、8字符串转换整数(atoi)、82删除排序链表中的重复元素II、204二分查找、94二叉树的中序遍历、144二叉树的前序遍历

    Top1:Leetcode 129求根节点到叶节点数字之和 官方题解:https://leetcode.cn/problems/sum-root-to-leaf-numbers/solution/qi ...

  6. 求二叉树根节点到叶节点的所有路径

    257. 二叉树的所有路径 难度:简单 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径. 叶子节点 是指没有子节点的节点. 思路 使用迭代法,从根节点开始到叶节点 ...

  7. 二叉树根结点到叶节点的最短距离

    给定一棵二叉树,找出它的最小深度.最小深度是沿着从根节点到最近叶节点的最短路径的节点数目. 思路一:递归. 当节点左右子树都为null时,返回0 当左子树为null,返回右子树递归+1: 当右字数为n ...

  8. 【leetcode-DFS】求根节点到叶节点数字之和/二叉树的最大路径和/路径总和/左叶子之和/树的直径

    文章目录 求根节点到叶节点数字之和 深度优先搜索 广度优先搜索 二叉树的最大路径和 DFS 路径总和1 深度优先搜索 广度优先搜索 路径总和2 回溯法 广度优先搜索 左叶子之和 递归 DFS 树的直径 ...

  9. 对于一颗给定的二叉树,输出所有从根节点到叶节点的路径

    给定二叉树,输出所有从根节点到叶节点的路径! 如上图二叉树所示,所有的路径应该是:[[10,1,5,12],[10,1,5,11],[10,1,7,9],[10,2,8,3],[10,2,8,20]] ...

最新文章

  1. ecside 列表排序问题
  2. Go 语言编程 — 基本数据类型
  3. SpringBoot+tomcat+web
  4. Node.js小白开路(一)-- fs篇
  5. 如何安装rpm包?掌握rpm包管理工具就够了
  6. Amazon Aurora:高吞吐量云原生关系数据库的设计考虑
  7. html中radio,checkbox值的获取、赋值、注册事件
  8. c++STL的反向迭代器
  9. php 邮件发送是html 没样式_使用python发送邮件
  10. setwindowpos怎么改变z序_Windows转Mac——操作习惯的改变!
  11. Mysql重新安装(ubuntu)
  12. mongodb java 不等于_mongoDB在java上面的应用
  13. Mac版 matlab 安装 GAOT工具箱
  14. Ubuntu软件安装新选择—星火应用商店(QQ、微信等一网打尽)
  15. 米思齐 超声波传感器控制小灯泡
  16. 微信公众号在开发者模式下自定义菜单
  17. 物联网技术实现农业自动化
  18. l0phtcrack 7(爆破管理员密码)使用教程
  19. 顺序表的定义和基本操作
  20. 什么是群发单显和分别发送,有什么区别,发客户邮件忘记群发单显

热门文章

  1. 从零开始搭建自己的网站一:整体步骤
  2. win10电脑找不到WLAN的解决方法(不显示附近wifi)
  3. 华为平板可不可以安装Android,华为平板能跟iPad过招?MatePad Pro在安卓称王但用户不一定买单...
  4. 敏捷项目管理21天学习计划--敏捷生命周期
  5. J2PaaS低代码开发平台——信息化系统的流水线工厂
  6. ParaView绘制自由水面的等值线图
  7. 虚拟机安装centos7上网设置总结
  8. OPPO K9和OPPO K7参数对比 选哪个
  9. ffmpeg的各种黑科技
  10. HALO博客配置华为云OSS上传附件