【LeetCode题解】2859. 计算 K 置位下标对应元素的和+938. 二叉搜索树的范围和+1028. 从先序遍历还原二叉树(三种方法:栈+递归+集合)

本文主要是介绍【LeetCode题解】2859. 计算 K 置位下标对应元素的和+938. 二叉搜索树的范围和+1028. 从先序遍历还原二叉树(三种方法:栈+递归+集合),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • [2859. 计算 K 置位下标对应元素的和](https://leetcode.cn/problems/sum-of-values-at-indices-with-k-set-bits/)
          • 思路:
      • [938. 二叉搜索树的范围和](https://leetcode.cn/problems/range-sum-of-bst/)
          • 思路:
            • 写法一:在中间累加
            • 写法二:在最后累加
      • 1028. 从先序遍历还原二叉树(三种方法:栈+递归+集合)
    • 一、栈+ while迭代
      • 1.思路
      • 2.代码
    • 二、递归法
      • 1.思路
      • 2.代码
    • 三、集合存储
      • 1.思路
      • 2.代码

2859. 计算 K 置位下标对应元素的和

在这里插入图片描述

思路:

遍历输入列表,对于满足特定条件的元素做一些操作并将结果累加起来。其中,bitCount 辅助方法用于计算一个整数的二进制表示中有多少个 1。

  1. 遍历给定列表 nums 中的所有元素,用索引 i 表示当前元素所在位置。
  2. 对于每个索引 i,调用辅助方法 bitCount(i),返回它的二进制表示中 1 的个数。
  3. 检查步骤 2 中得到的 1 的个数是否等于给定值 k
  4. 如果匹配,则将当前索引 i 所在位置上的值加入到答案 ans 中。
  5. 循环结束后,返回 ans 作为最终结果。
public int sumIndicesWithKSetBits(List<Integer> nums, int k) {int ans = 0;for (int i = 0; i < nums.size(); ++i) {if (bitCount(i) == k) {ans += nums.get(i);}}return ans;
}/*** 计算一个整数的二进制表示中有多少个1* @param x 要计算的整数* @return 二进制中1的个数*/
public int bitCount(int x) {int cnt = 0;while (x != 0) {cnt += (x % 2);x /= 2;}return cnt;
}

938. 二叉搜索树的范围和

在这里插入图片描述

思路:

1.在二叉搜索树中:左子树的结点都小于根节点,右子树的结点都大于根节点,每个结点法左右子树均要符合二叉搜索树

2.如果根节点的值大于hight,就排除右树,只在左树中查找

3.如果根节点的值小于low,就排除左树,只在右树中查找

4.如果正好在两者之间,则左树右树都要考虑,将根节点的值和递归的结果累加

写法一:在中间累加
    //[938. 二叉搜索树的范围和]-写法二
//public int rangeSumBST2(TreeNode root, int low, int high) {if (root==null){return 0;}int x = root.val;int sum = low<=x && x<=high?x:0;//根节点的值如果在范围内,返回根节点的值,否则就返回0,相当于排除了不在范围内的值if(x>low){sum+=rangeSumBST2(root.left,low,high);}if (x<high){sum+=rangeSumBST2(root.right,low,high);}return sum;}
写法二:在最后累加
    //[938. 二叉搜索树的范围和]public int rangeSumBST(TreeNode root, int low, int high) {if (root == null) {return 0;}int x = root.val;if (x > high) {return rangeSumBST(root.left, low, high);//右树不在范围内,只需要递归左树}if (x < low) {return rangeSumBST(root.right, low, high);//左树不在范围内,只需要递归左树}return x + rangeSumBST(root.left, low, high) + rangeSumBST(root.right, low, high);//左右子树都可能}

1028. 从先序遍历还原二叉树(三种方法:栈+递归+集合)


在这里插入图片描述
在这里插入图片描述

一、栈+ while迭代

1.思路

1.遍历整个字符串,从0开始,根节点在第0层
2.用level记录层数,每遇到一个-字符,当前层数+1
3.用val记录要插入的结点的值,遍历取到的数字,通过字符运算得到值。
4.找到当前要插入结点的父结点,栈的大小要小于当前层数
5.如果节点只有一个子节点,那么保证该子节点为左子节点。
6.将创建的新结点入栈
7.除了根节点,其他子节点全部出栈,返回根节点

2.代码

    public TreeNode recoverFromPreorder(String traversal) {Stack<TreeNode> stack = new Stack<>();//用栈来存储结点for (int i = 0; i < traversal.length(); ) {//遍历整个字符串,从0开始,根节点在第0层int level = 0;//记录当前层数while (traversal.charAt(i) == '-') {//每遍历到一个-,层数累加level++;i++;}int val = 0;//查看当前要插入结点的数字while (i < traversal.length() && traversal.charAt(i) != '-') {//当前的字符是数字,并且未超过字符串val = val * 10 + (traversal.charAt(i) - '0');//根据字符的相加,遍历字符串找数字时 只能一个数字一个数字的转,// 但是字符串中连续的数字是一个多位数,需要前面的数字*10变高位,再加上后面的数,// 成为一个数,作为新结点的值i++;}while (stack.size() > level) {stack.pop();//找到当前要插入结点的父结点}TreeNode node = new TreeNode(val);//创建新结点if (!stack.isEmpty()) {//如果节点只有一个子节点,那么保证该子节点为左子节点。if (stack.peek().left == null) {stack.peek().left = node;} else {stack.peek().right = node;}}stack.add(node);//入栈}while (stack.size() > 1) {stack.pop();//要返回根节点,出到栈只有一个结点}return stack.pop();}

二、递归法

1.思路

1.利用helper函数,根据字符和对应深度创建结点,还原二叉树
2.每遇到-字符,层数加一
3.如果遍历的深度和获取到的深度不一致,返回空
4.当深度等于层数时,下一个结点的位置从index + level开始
5.通过字符运算获取数字,同时创建结点
6.根节点的左树调用helper函数递归,如果左子节点是空,那么右子节点肯定也是空的
7.如果根节点的左树不为空,要想添加结点,递归右树。
8.最终返回根节点

2.代码

    //102. 二叉树的层序遍历---递归写法int index = 0;//index记录遍历到字符串的哪个位置public TreeNode recoverFromPreorder3(String traversal) {return helper(traversal,0);}public TreeNode helper(String s, int depth) {//helper函数用来创建二叉树int level = 0;//记录层数while (index + level < s.length() && s.charAt(index + level) == '-') {level++;}//如果遍历的深度和获取到的深度不一致,返回空if (level != depth){return null;}int next = index + level;//获取数字while (next < s.length() && s.charAt(next) != '-')next++;int val = Integer.parseInt(s.substring(index + level, next));index = next;//创建结点TreeNode root = new TreeNode(val);root.left = helper(s, depth + 1);if (root.left == null) {//如果左子节点是空,那么右子节点肯定也是空的root.right = null;} else {root.right = helper(s, depth + 1);}return root;}

三、集合存储

1.思路

1.使用正则匹配把字符串S拆成不同的数字存进数组中,用集合list来存储结点
2.将根节点添加到list中,层数从1开始,不包括根节点
3.数组存储的位置不为空时,根据转换的值创建结点
4.将结点加入到集合中
5.获取父结点,插入结点,并从新设置层数,果满了,层数加一
6.最终返回根节点

2.代码

    //102. 二叉树的层序遍历--正则匹配public TreeNode recoverFromPreorder2(String traversal) {String[] valus = traversal.split("-");//使用正则匹配把字符串S拆成不同的数字,用集合list来存储结点List<TreeNode> list = new ArrayList<>();list.add(new TreeNode(Integer.valueOf(valus[0])));//根节点//根节点添加到list中int level = 1;//层数层1开始,不包括根节点for (int i = 1; i < valus.length; i++) {if (!valus[i].isEmpty()) {//数组存储的位置不为空TreeNode node = new TreeNode(Integer.valueOf(valus[i]));//根据转化的值,创建结点//因为是前序遍历,每层我们只需要存储一个结点即可,这个节点值有可能//会被覆盖,如果被覆盖了说明这个节点以及他的子节点都以及遍历过了,//所以不用考虑被覆盖问题list.add(level, node);//将结点加入到集合中TreeNode parent = list.get(level - 1);//获取父结点,插入结点,并从新设置层数if (parent.left == null) {parent.left = node;} else {parent.right = node;}level = 1;} else {level++;//如果满了,层数加一}}return list.get(0);}

点击移步博客主页,欢迎光临~

偷cyk的图

这篇关于【LeetCode题解】2859. 计算 K 置位下标对应元素的和+938. 二叉搜索树的范围和+1028. 从先序遍历还原二叉树(三种方法:栈+递归+集合)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/771627

相关文章

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac

详解Java中三种状态机实现方式来优雅消灭 if-else 嵌套

《详解Java中三种状态机实现方式来优雅消灭if-else嵌套》这篇文章主要为大家详细介绍了Java中三种状态机实现方式从而优雅消灭if-else嵌套,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录1. 前言2. 复现传统if-else实现的业务场景问题3. 用状态机模式改造3.1 定义状态接口3

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

基于Python实现数字限制在指定范围内的五种方式

《基于Python实现数字限制在指定范围内的五种方式》在编程中,数字范围限制是常见需求,无论是游戏开发中的角色属性值、金融计算中的利率调整,还是传感器数据处理中的异常值过滤,都需要将数字控制在合理范围... 目录引言一、基础条件判断法二、数学运算巧解法三、装饰器模式法四、自定义类封装法五、NumPy数组处理

Python中经纬度距离计算的实现方式

《Python中经纬度距离计算的实现方式》文章介绍Python中计算经纬度距离的方法及中国加密坐标系转换工具,主要方法包括geopy(Vincenty/Karney)、Haversine、pyproj... 目录一、基本方法1. 使用geopy库(推荐)2. 手动实现 Haversine 公式3. 使用py

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda