L538. 把二叉搜索树转换为累加树

news/2024/11/17 6:41:59/
  1. 把二叉搜索树转换为累加树
    给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。

例如:

输入: 原始二叉搜索树:

			 5/   \2     13输出: 转换为累加树:18/   \20     13

注意:本题和 1038: https://leetcode-cn.com/problems/binary-search-tree-to-greater-sum-tree/ 相同

1.利用各种集合来做,就是任意一种遍历方式,获取所有的数据集合,然后先排序,再遍历一次修改数据

class Solution {ArrayList<Integer> list;HashMap<Integer, Integer> map;public TreeNode convertBST(TreeNode root) {if(root == null) return null;list = new ArrayList<>();dfs(root);Collections.sort(list);//排序map = new HashMap<>();//将应该修改的值放在map中int sum = 0;for(Integer nn:list){sum += nn;}int tmp = 0;for(Integer nn: list){map.put(nn, sum - tmp);tmp += nn;}dfs2(root);//更新return root;}void dfs(TreeNode root){if(root == null) return;list.add(root.val);dfs(root.left);dfs(root.right);}void dfs2(TreeNode root){if(root == null) return;root.val = map.get(root.val);dfs2(root.left);dfs2(root.right);}
}

2.注意题意已经说明,这是一个二叉搜索树,上面的解法,并没有用到这个前提,
这里直接利用变形的中序遍历,这样求和的时候直接可操作

class Solution {int sum = 0;public TreeNode convertBST(TreeNode root) {if(root == null) return null;else{//变形的中序遍历,先右边,再左边convertBST(root.right);sum += root.val;//就是这两行root.val = sum;convertBST(root.left);}return root;}
}

可以直接这样写的

class Solution {int sum = 0;public TreeNode convertBST(TreeNode root) {if(root == null) return null;convertBST(root.right);sum += root.val;root.val = sum;convertBST(root.left);return root;}}

不太习惯直接在原函数递推,特别还是返回值

class Solution {int sum = 0;public TreeNode convertBST(TreeNode root) {if(root == null) return null;//一般我会再创建一个函数dfs(root);return root;}void dfs(TreeNode root){//这里有返回值一样也是可以的if(root == null) return;dfs(root.right);sum += root.val;root.val = sum;dfs(root.left);}
}

3.利用迭代的方法来求,其实就是变形的中序遍历迭代方法,右中左,利用一个栈

class Solution {int sum = 0;public TreeNode convertBST(TreeNode root) {if(root == null) return null;//迭代方法TreeNode node = root;//先提前保存LinkedList<TreeNode> st = new LinkedList<>();while(root != null || !st.isEmpty()){while(root!= null){st.push(root);root = root.right;}root = st.pop();sum += root.val;//注意这个是在前面,因为是包含本身的值root.val = sum;root = root.left;}//return root;注意因为这个又返回值,但是root一直在变化return node;}
}

众所周知,二叉树的先序遍历一共两种方式,这里只适用于上面那种,对于另一种则不适用,因为那个只能从根节点开始相加


http://www.ppmy.cn/news/131538.html

相关文章

尼康Z5全画幅微单相机即将发布 主攻入门市场

本文来自太平洋电脑网 尼康在CP2019上的确认了一台&#xff0c;定位与佳能EOS RP系列相似的相机Z5&#xff0c;还会对标索尼A7m2&#xff0c;价格估计会在1000美元左右。 很多人都对尼康Z5的传感器抱有很大的期待&#xff0c;很多人都想要尼康Z6同款的2450万像素&#xff0c;我…

官方确认佳能下一代全画幅微单相机配备机身防抖

本文来自太平洋电脑网 用了佳能EOS R的摄影师都会有个想法&#xff0c;就是如果能搭载机身防抖就完美了。正所谓念念不忘&#xff0c;必有回响&#xff0c;各位心心念念的机身防抖被官方确定采用&#xff0c;会在下一代EOS R上出现。 这是来自佳能的一份内部计划&#xff0c;表…

只看参数 松下S1/S1R能否算是“最强微单”?

从M43画幅的G1发布&#xff0c;到全画幅S1/S1R正式发布&#xff0c;松下用了十年半的时间打怪升级&#xff0c;如今终于攒齐一身极品极品装备。经历了数次发布会后&#xff0c;昨天S1/S1R终于正式发布。从纸面参数看&#xff0c;这两台相机的性能相当不错&#xff0c;从图像拍摄…

html能控制佳能相机吗,佳能EOS R可选镜头多吗 是否支持佳能单反镜头

佳能EOS R是佳能发布的全新全画幅专业微单相机&#xff0c;全新EOS R采用了新的RF卡口&#xff0c;随之一同发布的有4枚新设计的RF卡口镜头&#xff0c;除此之外&#xff0c;EOS R还可通过镜头卡口适配器适配原有的EF卡口(含EF-S卡口)镜头&#xff0c;等于原有全线佳能单反EF镜…

我理解的单反,单电和微单间的区别

本人新手&#xff0c;未接触过单反&#xff0c;单电和微单&#xff0c;但是准备入手一只单反&#xff0c;结果发现现在科技已经日新月异&#xff0c;在原来的单反界已经有了很多的衍伸产品&#xff0c;单电和微单。 本文只是在我查阅的资料和个人理解的基础上做的一个总结&…

在线佳能计算机,佳能相机秒变电脑摄像头 高画质直播新玩法

原标题:佳能相机秒变电脑摄像头 高画质直播新玩法 出自蜂鸟网-器材,原文链接:https://m.fengniao.com/document/5362626.html 随着网络直播与在线视频会议的飞速发展,视频的画面品质变得越来越重要,而传统的直播,通常使用手机、电脑的前置摄像头,画质差,噪点感人,色彩…

佳能G系列领军相机G1X

在今年2月份&#xff0c;佳能推出的G系列相机的怪物旗舰机G1X&#xff0c;说它怪&#xff0c;就因为它采用了一块尺寸为18.714mm的CMOS&#xff0c;焦距换算倍数为1.85。之前的G系列都是采用小尺寸CMOS&#xff0c;最大的G12也就是1/1.7&#xff0c;这个成为G系列的一个瓶颈。G…

买单电微单相机

1&#xff0c;入门单反都有全自动模式&#xff0c;在全自动模式下&#xff0c;不需要专业技术一样可以拍得到较好的照片。 2&#xff0c;决定画质的最主要因素是传感器尺寸。 尼康J1/V1的传感器面积是116mm&#xff0c; 松下GF3的传感器面积是225mm&#xff0c; 奥林巴斯微单的…