第538题


给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。 例如: 输入: 二叉搜索树:
5
/ \
2 13 输出: 转换为累加树:
18
/ \
20 13 来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/convert-bst-to-greater-tree

概念

二叉搜索树

二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。

中序遍历

中序遍历(LDR)是二叉树遍历的一种,也叫做中根遍历、中序周游。在二叉树中,中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。

解题思路

  • 从定义我们知道,BST的中序遍历为一个递增序列
  • 我们将中序遍历倒置(先右子树,后根节点、再左子树),即可实现一个递减序列
  • 遍历该序列,从大往小累加并更新节点值,即可实现累加树(节点值=原来的节点值加上所有大于它的节点值之和)

代码实现

1.递归倒置中序遍历思路实现

//递归实现
class Solution1 {
public TreeNode convertBST(TreeNode root) {
addSum(root, 0);
return root;
} public int addSum(TreeNode node, int parentVal) {
//如果没有节点了,返回父节点值
if (node == null) {
return parentVal;
} //累加右边所有节点值
int rVal = addSum(node.right, parentVal); //当前节点值=右边所有节点累加值+当前节点值
node.val += rVal;
//System.out.println("当前节点值:" + node.val); //累加左边所有节点值
int lVal = addSum(node.left, node.val);
return lVal;
}
}

2.利用堆栈,去递归化实现

//利用堆栈,去递归化
class Solution2 {
public TreeNode convertBST(TreeNode root) {
TreeNode oRoot = root;
Stack<TreeNode> stack = new Stack();
int sum = 0;
while (true) {
//右节点入栈
while (root != null) {
stack.push(root);
root = root.right;
} //如果栈为空退出循环
if (stack.empty()) {
break;
}
//否则出栈进入计算
else {
TreeNode node = stack.pop();
//更新节点值
node.val += sum;
//更新sum值
sum = node.val;
//左节点进入[右节点入栈]
root = node.left;
}
}
//返回原树,此时该树所有节点已做更新
return oRoot;
}
}

总结

我们通过提交代码发现堆栈实现会比递归执行效率慢很多,这是因为:

  • 尾递归被jvm编译器识别并针对其迭代对应进行优化处理过
  • 堆栈实现需要频繁的push(入栈)、pop(出栈)操作导致性能下降

资料

LeetCode 把二叉搜索树转换为累加树的更多相关文章

  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. [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 ...

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

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

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

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

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

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

  8. 从二叉搜索树到AVL树再到红黑树 B树

    这几种树都属于数据结构中较为复杂的,在平时面试中,经常会问理解用法,但一般不会问具体的实现,所以今天来梳理一下这几种树之间的区别与联系,感谢知乎用户@Cailiang,这篇文章参考了他的专栏. 二叉查 ...

  9. Java实现 LeetCode 669 修剪二叉搜索树(遍历树)

    669. 修剪二叉搜索树 给定一个二叉搜索树,同时给定最小边界L 和最大边界 R.通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) .你可能需要改变树的根节点,所以结果应当返回 ...

随机推荐

  1. 浅谈python中文件和文件夹的相关操作

    文件操作 文件的打开与关闭 打开文件 使用open(文件名,访问方式)函数,可以打开一个已存在的文件,或者创建一个新的文件. 示例如下: f = open('test.txt') # 访问方式可以省略 ...

  2. (18)ASP.NET Core 基于现有数据库创建EF模型(反向工程)

    1.简介 Entity Framework Core可通过数据库提供给应用程序的插件访问许多不同的数据库.我们可以通过使用Entity Framework Core构建执行基本数据访问的ASP.NET ...

  3. 深入理解Nginx及使用Nginx实现负载均衡

    前言: 最近在部署项目时要求实现负载均衡,有趣的是发现网上一搜全部都是以下类似的配置文件 upstream localhost{ server 127.0.0.1:8080 weight=1; ser ...

  4. python模块之junos-eznc

    一.简介 本文将使用python模块中的junos-eznc来控制juniper的 Junos OS系统,此模块可以在windows平台和UNIX平台上使用 二.实验环境 1.操作系统:win10 2 ...

  5. Gradle 是什么

    写在前面的话,最近在系统的学习Gradle,本来想写一篇关于 Gradle 的介绍. 但在官网发现了这篇关于 Gradle 的介绍,已经介绍的很好了,我就很直接翻译过来了. 原文地址 https:// ...

  6. 玩转 SpringBoot 2 快速搭建 | Spring Tool Suite篇

    Spring Tool Suite (STS) 工具介绍 我个人比较推荐使用 Spring Tool Suite(STS),之所以推荐使用 Spring Tool Suite(STS) ,是因为它是 ...

  7. java高并发系列 - 第32天:高并发中计数器的实现方式有哪些?

    这是java高并发系列第32篇文章. java环境:jdk1.8. 本文主要内容 4种方式实现计数器功能,对比其性能 介绍LongAdder 介绍LongAccumulator 需求:一个jvm中实现 ...

  8. Linux下各目录及其作用

    目录及其作用 /:根目录,一般根目录下只存放目录,不要存放件,/etc./bin./dev./lib./sbin应该和根目录放置在一个分区中 /bin: /usr/bin: 可执行二进制文件的目录,如 ...

  9. Java反射使用总结

    最近公司招了几名刚毕业的大学生,在给他们培训的过程中,讲到反射,他们有些人听不懂,对反射的概念云里雾里的,不知道反射有什么用. 因此就有了本文的诞生. 反射是java提供的一个重要功能,可以在运行时检 ...

  10. SPSS数据分析方法不知道如何选择

      一提到数学,高等数学,线性代数,概率论与数理统计,数值分析,空间解析几何这些数学课程,头疼呀.作为文科生,遇见这些课程时,通常都是各种寻求帮助,班上有位宅男数学很厉害,各种被女生‘围观’,这数学为 ...