首页 > 其他分享 >力扣1038. 从二叉搜索树到更大和树(dfs)

力扣1038. 从二叉搜索树到更大和树(dfs)

时间:2023-12-06 11:13:08浏览次数:27  
标签:树到 TreeNode val dfs 力扣 null root 节点

给定一个二叉搜索树 root (BST),请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。

提醒一下, 二叉搜索树 满足下列约束条件:

  • 节点的左子树仅包含键 小于 节点键的节点。
  • 节点的右子树仅包含键 大于 节点键的节点。
  • 左右子树也必须是二叉搜索树。

 

示例 1:

输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

 

示例 2:

输入:root = [0,null,1]
输出:[1,null,1]

 

 

提示:

  • 树中的节点数在 [1, 100] 范围内。
  • 0 <= Node.val <= 100
  • 树中的所有值均 不重复 。

 

正序遍历,左根右,需要遍历两次

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 8  *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 9  *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10  * };
11  */
12 class Solution {
13 public:
14     map<int,int> sum; //存取小于等于当前节点值的和
15     int prev = 0;
16     void dfs(TreeNode* root){
17         if (root!=nullptr){
18             dfs(root->left);
19             prev+=root->val;
20             sum[root->val]=prev;
21             cout<<root->val<<" ";
22             dfs(root->right);
23         }
24     }
25     void solve(TreeNode* root){
26         if (root!=nullptr){
27             solve(root->left);
28             root->val = prev - sum[root->val] + root->val;
29             solve(root->right);
30         }
31     }
32     TreeNode* bstToGst(TreeNode* root) {
33         dfs(root);
34         solve(root);
35         return root;
36     }
37 };

逆序遍历,右根左,只需遍历一次

 1 class Solution {
 2 public:
 3     int sum; //存取大于等于当前节点值之和
 4     void dfs(TreeNode* root){
 5         if (root!=nullptr){
 6             dfs(root->right);
 7             sum+=root->val;
 8             root->val=sum;
 9             dfs(root->left);
10         }
11     }
12     TreeNode* bstToGst(TreeNode* root) {
13         dfs(root);
14         return root;
15     }
16 };

 

标签:树到,TreeNode,val,dfs,力扣,null,root,节点
From: https://www.cnblogs.com/coderhrz/p/17879073.html

相关文章

  • 力扣260
    Problem: 260.只出现一次的数字III思路①map计数②排序后,前后不一样的就是答案classSolution{public:vector<int>singleNumber(vector<int>&nums){intn=nums.size();vector<int>res;//map计数map<int,int>ma;for......
  • start-dfs.sh启动hadoop,jps没显示
    查看当前系统的名称[root@masterdfs]#cat/etc/hosts192.168.128.78hadoop01查看core-site.xml<property><name>fs.defaultFS</name><value>hdfs://hadoop01:9000</value></property>删除文件夹#先停止ha......
  • Linux FastDFS 更换服务器数据迁移的方法
    FastDFS是一个开源的高性能分布式文件系统,特别适合于大规模数据和访问量场景。使用FastDFS进行文件存储时,某些情况下,我们可能需要更换服务器,但服务器已经使用一段时间,这时需要将原服务上存储的文件数据进行迁移。本文主要介绍FastDFS中存储的文件进行数据迁移的方法。FastDFS......
  • 力扣---1423. 可获得的最大点数
    几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌。你的点数就是你拿到手中的所有卡牌的点数之和。给你一个整数数组 cardPoints 和整数 k,请你返回可以获得的最大......
  • 力扣137
    Problem: 137.只出现一次的数字II思路①排序后,前后不一样的就是答案②map计数后找出值为1的数复杂度时间复杂度、空间复杂度:思路①较优classSolution{public:intsingleNumber(vector<int>&nums){intn=nums.size();//排序后,前后不一样的就是答案......
  • 《力扣面试150题》题单拓展——回溯
    《力扣面试150题》题单拓展——回溯1.基础知识voidfind(string&s,inti,string&path){//终止条件 if(i==s.size()){ans.push_back(path);return;}for(intk=0;k<index[sub].size();k++){//处理一层path.push_bac......
  • 《力扣面试150题》题单拓展——滑动窗口
    《力扣面试150题》题单拓展——滑动窗口1.基础知识先区分好,枚举右端点,还是左端点,窗口内的条件改变后,一般都是while控制另一个窗口的移动,然后收集结算我感觉滑动窗口这里变动最大的,什么时候去滑动左窗口,什么时候去收集答案,都很不一样,得慢慢体会滑动窗口难题是真的难,呜呜呜呜......
  • 《力扣面试150题》题单拓展——双指针
    《力扣面试150题》题单拓展——双指针1.基础知识为什么双指针会正确?不会漏掉搜索空间数组nums递增排序,假设共8个元素假设由于搜索空间i<j的限制,只搜索右上角白色倒三角空间,一开始,我们检查右上方单元格(0,7),即计算A[0]+A[7],与target进行比较。如果不相等的话,则要么大......
  • 1027. 最优账单平衡(待完善)-dfs
    题目描述一群朋友在度假期间会相互借钱。比如说,小爱同学支付了小新同学的午餐共计10美元。如果小明同学支付了小爱同学的出租车钱共计5美元。我们可以用一个三元组(x,y,z)表示一次交易,表示x借给y共计z美元。用0,1,2表示小爱同学、小新同学和小明同学(0,1,2为......
  • 【DFS深度优先遍历】给定一个数组,从第一个开始,正好走到数组最后,所使用的最少步骤数
    题目描述给定一个数组,从第一个开始,正好走到数组最后,所使用的最少步骤数。要求:第一步从第一元素开始,第一步小于<len/2(len为数组的长度)。从第二步开始,只能以所在成员的数字走相应的步数,不能多也不能少,如果目标不可达返回-1,输出最少的步骤数,不能往回走。输入759426835......