LC538 - 把二叉搜索树转换为累加树

news2024/12/25 2:57:56

文章目录

  • 1 题目
  • 2 思路
  • 3 ACM模式
  • 参考

1 题目

https://leetcode.cn/problems/convert-bst-to-greater-tree/description/

给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree)

累加树:每个节点 node 的新值等于 原树中大于或等于node.val的值之和。

就是将原节点的值小的节点的值变为后面大的累加的值

例子
在这里插入图片描述
ACM模式:这里采用完全二叉树的方式构建二叉树

2 思路

原来值小的节点的新值是原来值大的节点的累加,这里需要对节点进行排序了

但是二叉搜索树又是排序好的,即中序遍历后的值就是排序好的值,左中右二叉搜索树为升序

这里的需求又是从大的值向小的值累加,可以将中序遍历的左右顺序颠倒,即左中右是升序排序,右中左是降序排序;可以采用右中左的顺序进行排序,在递归遍历的时候加入prev指针保存累加的值

class Solution{

    public TreeNode convertBST(TreeNode root) {
        inorderReverseTree(root);
        return root;
    }

    private TreeNode prev = null;

    private void inorderReverseTree(TreeNode root) {
        if (root != null) {
            inorderReverseTree(root.right);
            if (prev != null) {
                root.val = root.val + prev.val;
            }
            prev = root;
            inorderReverseTree(root.left);
        }
    }
}

Note: prev指针的使用方式,先判空,非空时已经保存了之前的值,然后再赋值

3 ACM模式

import java.util.*;

class TreeNode{

    int val;
    TreeNode left;
    TreeNode right;
    TreeNode() {}
    TreeNode(int val) {this.val = val; }

}

// Solution

public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        Solution solution = new Solution();
        String[] nums = in.nextLine().split(" ");
        List<TreeNode> nodes = new ArrayList<>();
        for (String num: nums) {
            if (!num.isEmpty()) {
                if ("null".equals(num)) {
                    nodes.add(null);
                } else {
                    nodes.add(new TreeNode(Integer.parseInt(num)));
                }
            }
        }
        constructTree(nodes);
        TreeNode root = nodes.get(0);
        solution.convertBST(root);
        preorderTree(root);
    }

    // 使用满二叉树
    public static void constructTree(List<TreeNode> nodes) {
        for (int i = 0; 2*i+1 < nodes.size(); i++) {
            if (nodes.get(i) != null) {
                nodes.get(i).left = nodes.get(2*i+1);
                if (2*i+2 < nodes.size()) {
                    nodes.get(i).right = nodes.get(2*i+2);
                }
            }
        }
    }

    public static void preorderTree(TreeNode root) {
        if (root != null) {
            System.out.print(root.val + " ");
            preorderTree(root.left);
            preorderTree(root.right);
        }
    }
}
/*
test case:
4 1 6 0 2 5 7 null null null 3 null null null 8
 */

参考

https://programmercarl.com/0538.把二叉搜索树转换为累加树.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2197859.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-08

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07目录1. GraphRouter: A Graph-based Router for LLM Selections摘要创新点算法模型实验效果结论推荐阅读指数 2. DOTS: Learni…

2024年诺贝尔物理学奖授予AI先驱 Hopfield 和Hinton,奖金1100万瑞典克朗,他们是ChatGPT的忠实用户

2024年诺贝尔物理学奖得主&#xff1a;AI领域的杰出科学家 获奖者 2024年诺贝尔物理学奖的获奖者是两位在人工智能&#xff08;AI&#xff09;尤其是机器学习技术方面做出杰出贡献的科学家&#xff1a;约翰霍普菲尔德和杰弗里欣顿。 瑞典皇家科学院在周二宣布&#xff0c;这两…

Shamiko模块:隐藏root

开启Zygisk 在安装Shamiko模块之前&#xff0c;需要使用面具开启Zygisk&#xff0c;在面具的设置里可以开启&#xff0c;开启后重启手机Zygisk生效。 开启后的样子 开启面具随机报名 在面具的设置里&#xff0c;找到“隐藏Magisk应用”&#xff0c;点击这个选项&#xff0…

ESP8266使用AT指令完成MQTT功能

ESP8266使用AT指令完成MQTT功能 在esp8266设备中烧录安信可的AT固件之后&#xff0c;进行AT指令完成信息发布&#xff0c;并最终实现在Homeassistant中发布传感器并设置传感器状态。 一、基础指令 以下是完整的步骤和对应的AT指令&#xff1a; 1. 配置ESP8266为Station模式 …

在线培训知识库管理系统:企业的明智之选

在当今这个快速变化的时代&#xff0c;企业之间的竞争日益激烈&#xff0c;知识更新速度之快前所未有。为了保持竞争力&#xff0c;企业不仅需要不断引入新技术、新方法&#xff0c;还需要确保员工能够及时掌握这些新知&#xff0c;将其转化为生产力。在此背景下&#xff0c;在…

codetop标签双指针题目大全解析(四),双指针刷穿地心!!!!!

复习复习复习&#xff01;&#xff01; 1.长度最小的子数组2.移动零3.盛水最多的容器4.旋转链表5.最接近的三数之和6.删除有序数组中的重复项7.返回倒数第k个节点的值8.四数之和9.验证回文串 1.长度最小的子数组 考滑动窗口的 要注意是大于等于不是等于 看错题目一顿调 class …

CNAI趋势下,打造一体化AI赋能平台

在数字化转型的浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;已成为推动企业创新和转型的核心力量。云原生技术以其灵活性和可扩展性&#xff0c;为AI的应用和发展提供了坚实的基础。本文将探讨云原生人工智能&#xff08;CNAI&#xff09;如何为企业带来颠覆性的变革…

cnn突破八(两层卷积核bpnet网络扩展)

cnn突破七中x【&#xff1f;】怎么求&#xff1f;我们举个例子&#xff1a; 接着cnn突破七&#xff1a; hicnn【】来自temphicnn【】2*2最大池化&#xff1a; temphicnn[0]x[i0,j0,5*5方阵]*w1cnn[0-24]&#xff0c; hicnn是5*5的&#xff0c;temphicnn是10*10的&#xff0…

YOLOv8改进 - 注意力篇 - 引入SimAM注意力机制

一、本文介绍 作为入门性篇章&#xff0c;这里介绍了SimAM注意力在YOLOv8中的使用。包含SimAM原理分析&#xff0c;SimAM的代码、SimAM的使用方法、以及添加以后的yaml文件及运行记录。 二、SimAM原理分析 SimAM官方论文地址&#xff1a;SimAM文章 SimAM官方代码地址&#…

【土地那些事儿】一文读懂“集体所有土地”

今天咱们来聊一个既熟悉又神秘的概念——集体所有土地。在中国广袤的大地上&#xff0c;除了国有土地外&#xff0c;还有一种特殊的土地所有权形式&#xff0c;它关乎亿万农民的切身利益&#xff0c;那就是集体所有土地。来&#xff0c;让我们一起揭开它的面纱吧&#xff01; …

根据指数做波段年化利率分析

根据指数做波段年化利率分析 股票投资&#xff0c;是众多投资方式中的一种。然而&#xff0c;每个人有不同的炒股方式&#xff0c;对股票不同的操作也会获得不同的收益/损失。作为“金融消费者”&#xff0c;如何做好自己在股票中的消费行为&#xff0c;是一门巨大的学问。这里…

D31【python 接口自动化学习】- python基础之输入输出与文件操作

day31 文件的打开 学习日期&#xff1a;20241008 学习目标&#xff1a;输入输出与文件操作&#xfe63;-43 常见常新&#xff1a;文件的打开 学习笔记&#xff1a; 文件的概念 使用open()函数打开文件 文件路径处理 文件打开模式 总结 文件操作包括&#xff1a;打开&#…

C++:string (用法篇)

文章目录 前言一、string 是什么&#xff1f;二、C语法补充1. auto2. 范围for 三、string类对象的常见构造1. Construct string object2. String destructor3. operator 四、string迭代器相关1. begin与end1&#xff09;begin2&#xff09;end3&#xff09;使用 2. rbegin 与 r…

第33次CCF计算机软件能力认证-第4题十滴水

题干&#xff1a; 十滴水是一个非常经典的小游戏。 小 C C C 正在玩一个一维版本的十滴水游戏。 我们通过一个例子描述游戏的基本规则。 游戏在一个 1 c 1c 1c 的网格上进行&#xff0c;格子用整数 x ( 1 ≤ x ≤ c ) x(1≤x≤c) x(1≤x≤c) 编号&#xff0c;编号从左往…

Metal之旅——数据

顶点数据 顶点数据&#xff08;Vertex Data&#xff09;是指一系列顶点的集合&#xff0c;这些顶点用于图形渲染管线的输入。每个顶点通常包含位置、颜色、纹理坐标等属性信息 mesh网络 Mesh网络是指metal中通过将不同数量形状的三角形拼在一起覆盖在要绘制图形表面的网络 顶…

007集—— 自动获取图形的外边界(外轮廓)(CAD—C#二次开发入门)

本文只适用于闭合多段线组成的图像,其他情况(圆、弧、椭圆、未封闭line)暂不支持。 效果如下图所示: 原始图: 代码运行后图: 附代码: public class 外轮廓{Database db = HostApplicationServices.WorkingDatabase;[CommandMethod("xx")]public void Demo(…

基于SSM车位租赁系统【附源码】

基于SSM车位租赁系统 效果如下&#xff1a; 注册页面 首页展示 车位租赁订单展示 车位列表页面 公告信息管理页面 公告类型管理界面 研究背景 随着经济的持续增长和城市化进程的加速&#xff0c;土地资源变得日益紧缺&#xff0c;停车难问题已成为许多城市面临的共同挑战。随…

【Redis】List类型的常用命令大全

这里的list列表相当于一个双端队列&#xff0c;也可以认为是双向链表&#xff0c;也可以认为是数组&#xff0c;后续的很多命令都使用到下标。 list的特点&#xff1a; list中的每个元素也都是String类型里面的元素可以重复列表中的元素是有序的&#xff0c;如果里面元素顺序进…

epoll究竟是同步的还是异步的?

简单说一句话&#xff0c;你需要分层看这个事&#xff1a; epoll 这个系统调用&#xff0c;是同步的&#xff0c;也就是必须等待操作系统返回值。 而底层用了 epoll 的封装后的框架&#xff0c;可以是异步的&#xff0c;只要你暴露给外部的接口&#xff0c;无需等待你的返回值…

DDD简介

概述 传统的数据驱动开发模式&#xff0c;View、Service、Dao这种三层分层模式&#xff0c;会很自然的写出过程式代码&#xff0c;这种开发方式中的对象只是数据载体&#xff0c;而没有行为&#xff0c;是一种贫血对象模型。以数据为中心&#xff0c;以数据库ER图为设计驱动&a…