将二叉搜索树转换为累加树

力扣题目链接(opens new window)

给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

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

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

示例 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]

示例 3:

  • 输入:root = [1,0,2]
  • 输出:[3,3,2]

示例 4:

  • 输入:root = [3,2,4,1]
  • 输出:[7,9,4,10]

提示:

  • 树中的节点数介于 0 和 104 之间。
  • 每个节点的值介于 -104 和 104 之间。
  • 树中的所有值 互不相同 。
  • 给定的树为二叉搜索树。

思路

题目的意思是从二叉搜索树的右子树的最右边一个节点开始,不断累加前一个节点的值并更新为当前节点的值

感觉就算这么说还是不太好理解

二叉搜索树知道吧?如果按照中序遍历(不记得就看这里)获取到整颗树的节点值,那么将构成一个升序数组

此时,如果我们倒着遍历这个数组并将每个元素前面的值累加到当前值位置,不就完成了题目的要求吗?

举个例子:

一个有序数组[2, 5, 13],求从后到前的累加数组,也就是[20, 18, 13]

因此,本题中遍历二叉搜索树的顺序应该是右中左,这样得到的结果就是一个降序数组,即从二叉搜索树的右子树的最右边一个节点开始的数组

递归法

先用递归做做

1、确定递归函数参数和返回值

只是要操作一颗二叉树,不涉及回溯返回节点值,不需要返回值

参数是当前节点指针

2、确定终止条件

遍历操作嘛,当前指针指向空就可以停止递归了

3、单层处理逻辑

按照前面讨论的,我们使用右中左的顺序来遍历,目的是得到一个降序的数组

当遍历到中节点时,让当前节点的值累加上前一节点的值即可

class Solution {
public:
int pre = 0;//用于保存前一节点值
//确定递归函数参数和返回值
void traversal(TreeNode* cur){
//确定终止条件
if(cur == NULL) return;
//确定单层处理逻辑
//调用递归
//右
traversal(cur->right);
//中,处理累加逻辑
cur->val += pre;
pre = cur->val;
//左
traversal(cur->left);
}
TreeNode* convertBST(TreeNode* root) {
traversal(root);
return root;
}
};

迭代法

迭代法解的话就是经典模板套用即可,详见

class Solution {
public:
TreeNode* convertBST(TreeNode* root) {
//定义栈
stack<TreeNode*> st;
//定义当前指针
TreeNode* cur = root;
//定义变量保存前一节点值
int pre = 0;
//遍历
while(!st.empty() || cur != NULL){
if(cur != NULL){//cur不为空,后面还有数,继续遍历
//压栈
st.push(cur);
cur = cur->right;//右
}else{//为空,说明遍历到了当前分支的叶子节点
cur = st.top();//中,取出节点
st.pop();
cur->val += pre;//累加
pre = cur->val;//记录前一节点值 //判断每个出栈的节点是否有左右子节点
//如果有,则又会触发if的第一个条件,继续将右子节点压栈
cur = cur->left;//左
//不存在的话cur指向空就又来到else这
}
}
return root;
}
};
注意点

从栈中取节点之后别忘了弹出

【LeetCode二叉树#20】二叉搜索树转换为累加树,巩固二叉树的遍历(特殊的中序遍历)的更多相关文章

  1. [LeetCode] 538. 把二叉搜索树转换为累加树 ☆(中序遍历变形)

    把二叉搜索树转换为累加树 描述 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和. ...

  2. Java实现 LeetCode 538 把二叉搜索树转换为累加树(遍历树)

    538. 把二叉搜索树转换为累加树 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和 ...

  3. Leetcode 538. 把二叉搜索树转换为累加树

    题目链接 https://leetcode.com/problems/convert-bst-to-greater-tree/description/ 题目描述 大于它的节点值之和. 例如: 输入: ...

  4. 代码随想录算法训练营day23 | leetcode 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树

    LeetCode 669. 修剪二叉搜索树 分析1.0 递归遍历树时删除符合条件(不在区间中)的节点-如何遍历如何删除 如果当前节点大于范围,递归左树,反之右树 当前节点不在范围内,删除它,把它的子树 ...

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

    第538题 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和. 例如: 输入: 二叉 ...

  6. [Swift]LeetCode538. 把二叉搜索树转换为累加树 | Convert BST to Greater Tree

    Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original B ...

  7. 538 Convert BST to Greater Tree 把二叉搜索树转换为累加树

    给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和.例如:输入: 二叉搜索树:     ...

  8. 数据结构中的树(二叉树、二叉搜索树、AVL树)

    数据结构动图展示网站 树的概念 树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>=1)个有限节点组成一个具有 ...

  9. 剑指Offer25 二叉搜索树转换为排序双向链表

    /************************************************************************* > File Name: 25_BSTCon ...

  10. 【IT笔试面试题整理】二叉搜索树转换为双向链表

    [试题描述] 将二叉搜索树转换为双向链表 对于二叉搜索树,可以将其转换为双向链表,其中,节点的左子树指针在链表中指向前一个节点,右子树指针在链表中指向后一个节点. 思路一: 采用递归思想,对于二叉搜索 ...

随机推荐

  1. [转帖]cx_Oracle.DatabaseError: ORA-28040

    背景: python第三方库cx-Oracle连接Oracle数据库报错 ORA-28040 cx_Oracle.DatabaseError: ORA-28040: No matching authe ...

  2. [转帖]Linux性能优化(十五)——CPU绑定

    一.孤立CPU 1.孤立CPU简介 针对CPU密集型的任务,CPU负载较高,推荐设置CPU Affinity,以提高任务执行效率,避免CPU进行上下文切换,提高CPU Cache命中率. 默认情况下, ...

  3. CentOS7升级Glibc到超过2.17版本无法启动的解决办法

    CentOS7升级Glibc到超过2.17版本无法启动的解决办法 背景 今天有同事告知服务器宕机无法启动. 提示信息为: [sda] Assuming drive cache: write throu ...

  4. elementui 的tabs组件出现蓝色边框问题

    elementui 的tabs组件出现蓝色边框问题 /deep/ .el-tabs__item:focus.is-active.is-focus:not(:active) { -webkit-box- ...

  5. 学到了,原来 gzip 是种`连续分块`的压缩算法

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 我想要表述的是:假设有 10 mb的数据使用 gzip 算 ...

  6. Fabric配置块结构解析

    本文是区块链浏览器系列的第二篇. 上一篇介绍了交易块中的数据结构,这一篇介绍区块链网络中的配置块数据结构. 这两种区块中数据结构内容的区别主要Payload结构体中的Data域中的内容,接下来将以类图 ...

  7. Leetcode 42题 接雨水(Trapping Rain Water) Java语言求解

    题目链接 https://leetcode-cn.com/problems/trapping-rain-water/ 题目内容 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱 ...

  8. 修改windows电脑键盘按键映射

    改键的需求 买了一把61键的小键盘,有些按钮没有,比如Home.End.四个方向键,这些键需要按Fn+XX来实现,所以上网查了一下键盘按键修改的方法,即把按键给改了,比如把右边的Ctrl改成方向键. ...

  9. Linux 文件目录压缩与解压命令

    Linux 文件目录压缩与解压命令,融合多部Linux经典著作,去除多余部分,保留实用部分. compress压缩: compress是个历史悠久的压缩程序,文件经它压缩后,其名称后面会多出 &quo ...

  10. 目录 - JavaScript指南

    目   录 第一章.  JavaScript概述 第二章.  JavaScript语法基础 第三章.  JavaScript编程规范 第四章.  JavaScript工具集合 第五章.  JavaSc ...