二叉树:叶节点的一些操作
目录
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;}}
进阶:迭代实现
二叉树:叶节点的一些操作相关推荐
- java计算二叉树的节点最小值_java计算二叉树的高度以及叶节点个数
java实现二叉树的相关操作 代码如下 package 二叉树有关; import java.util.ArrayDeque; import java.util.Queue; public class ...
- Java创建遍历二叉树(递归)并求树高及叶节点个数(代码全)
在学习树的操作之后,我们就可以对数这种数据结构进行创建和使用了,话不多说,直接上代码 PS:为了代码复用和通用性,采用接口然后打包了整个工程,存储数据定义为泛型 一.接口及链结点定义 package ...
- LeetCode 742. 二叉树最近的叶节点(建立父节点信息+BFS)
文章目录 1. 题目 2. 解题 1. 题目 给定一个 每个结点的值互不相同 的二叉树,和一个目标值 k,找出树中与目标值 k 最近的叶结点. 这里,与叶结点 最近 表示在二叉树中到达该叶节点需要行进 ...
- 二叉树-求叶节点个数
对任何一棵二叉树:度为0的结点数(即叶节点) = 度为2的节点数 + 1: 当二叉树的总个数为奇数时,此二叉树"无度为1"的结点 当二叉树的总个数为偶数时,此二叉树"只有 ...
- Leetcode 129求根节点到叶节点数字之和、104二叉树的最大深度、8字符串转换整数(atoi)、82删除排序链表中的重复元素II、204二分查找、94二叉树的中序遍历、144二叉树的前序遍历
Top1:Leetcode 129求根节点到叶节点数字之和 官方题解:https://leetcode.cn/problems/sum-root-to-leaf-numbers/solution/qi ...
- 求二叉树根节点到叶节点的所有路径
257. 二叉树的所有路径 难度:简单 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径. 叶子节点 是指没有子节点的节点. 思路 使用迭代法,从根节点开始到叶节点 ...
- 二叉树根结点到叶节点的最短距离
给定一棵二叉树,找出它的最小深度.最小深度是沿着从根节点到最近叶节点的最短路径的节点数目. 思路一:递归. 当节点左右子树都为null时,返回0 当左子树为null,返回右子树递归+1: 当右字数为n ...
- 【leetcode-DFS】求根节点到叶节点数字之和/二叉树的最大路径和/路径总和/左叶子之和/树的直径
文章目录 求根节点到叶节点数字之和 深度优先搜索 广度优先搜索 二叉树的最大路径和 DFS 路径总和1 深度优先搜索 广度优先搜索 路径总和2 回溯法 广度优先搜索 左叶子之和 递归 DFS 树的直径 ...
- 对于一颗给定的二叉树,输出所有从根节点到叶节点的路径
给定二叉树,输出所有从根节点到叶节点的路径! 如上图二叉树所示,所有的路径应该是:[[10,1,5,12],[10,1,5,11],[10,1,7,9],[10,2,8,3],[10,2,8,20]] ...
最新文章
- ecside 列表排序问题
- Go 语言编程 — 基本数据类型
- SpringBoot+tomcat+web
- Node.js小白开路(一)-- fs篇
- 如何安装rpm包?掌握rpm包管理工具就够了
- Amazon Aurora:高吞吐量云原生关系数据库的设计考虑
- html中radio,checkbox值的获取、赋值、注册事件
- c++STL的反向迭代器
- php 邮件发送是html 没样式_使用python发送邮件
- setwindowpos怎么改变z序_Windows转Mac——操作习惯的改变!
- Mysql重新安装(ubuntu)
- mongodb java 不等于_mongoDB在java上面的应用
- Mac版 matlab 安装 GAOT工具箱
- Ubuntu软件安装新选择—星火应用商店(QQ、微信等一网打尽)
- 米思齐 超声波传感器控制小灯泡
- 微信公众号在开发者模式下自定义菜单
- 物联网技术实现农业自动化
- l0phtcrack 7(爆破管理员密码)使用教程
- 顺序表的定义和基本操作
- 什么是群发单显和分别发送,有什么区别,发客户邮件忘记群发单显