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

devtools/2024/12/21 21:58:40/

文章目录

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

1 题目

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

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

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

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

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

2 思路

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

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

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

java">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模式

java">import java.util.*;class TreeNode{int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) {this.val = val; }}// Solutionpublic 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.ppmy.cn/devtools/123326.html

相关文章

KiCad 综合笔记

开窗 选中顶层或者底层 Mask 层&#xff0c;然后进行覆铜&#xff1a; 四层板 KiCad Tutorial - How to make a 4 layer PCB https://bbs.elecfans.com/jishu_2365544_1_1.html 虽然在“电路板设置”中&#xff0c;可以选择铜层的类型&#xff0c;但如果选择了“电源层”&am…

攻防世界----->Replace

前言&#xff1a;做题笔记。 下载 查壳。 upx32脱壳。 32ida打开。 先运行看看&#xff1a; 没有任何反应&#xff1f; 猜测又是 地址随机化(ASLR)---遇见过。 操作参考&#xff1a; 攻防世界----&#xff1e;Windows_Reverse1_dsvduyierqxvyjrthdfrtfregreg-CSDN博客 然后…

中国通信技术革命史

文章目录 引言I 中国通信技术革命史电报中国卫星通信的历史固定电话寻呼机(BP机)大哥大(手机)制定自己的移动通信网络技术体系5G未来科技发展的总趋势:用更少的能量,传输、处理和存储更多的信息II 知识扩展通信史(单位能量的信息传输率越来越高,网络地不断融合。)超级智能…

LeetCode hot100---哈希表专题(C++语言)

常用的哈希数据结构 &#xff08;1&#xff09;unordered_set 只关心value&#xff0c;不关心key,set中的数据会自动升序&#xff08;2&#xff09;unordered_map 既关心value&#xff0c;又关心key,map中的数据会自动升序1、两数之和 &#xff08;1&#xff09;题目描述以…

【CSS】SCSS混合的使用

基本使用 Scss中的混合允许定义一组 CSS 规则&#xff0c;然后在不同部分重用这些规则 mixin flex {display: flex;justify-content: center;align-items: center; }.box1 {include flex; }.box2 {include flex; }与变量不同&#xff0c;混合不仅可以包含样式规则&#xff0c…

使用keras搭建GRU神经网络创作莎士比亚小说

目录 复现环境 完整代码 程序输出 复现环境 完整代码 import tensorflow as tf import keras import datetime# 将输入文本tokenize为token形成词典vocabulary,使用词典中token的索引id对文本每个token进行编码. data = I love you and me ? # 数据 text_layer = keras.…

php对接中通SDK问题

记一次对接中通接口遇到的问题。 中通SDK是4年前的了&#xff0c;就这他们技术人员说能拉取的都是最新的&#xff0c;囧。 1.修改ZopHttpUtil.php中的请求方式 public function post($url, $headers, $querystring)//$timeout{$ch curl_init();curl_setopt($ch, CURLOPT_UR…

10、论文阅读:基于双阶对比损失解纠缠表示的无监督水下图像增强

Unsupervised Underwater Image Enhancement Based on Disentangled Representations via Double-Order Contrastive Loss 前言引言方法介绍解耦框架多尺度生成器双阶对比损失双阶对比损失总结损失函数实验前言 在水下环境中拍摄的图像通常会受到颜色失真、低对比度和视觉质量…