LeetCode 把二叉搜索树转换为累加树
第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 把二叉搜索树转换为累加树的更多相关文章
- [LeetCode] 538. 把二叉搜索树转换为累加树 ☆(中序遍历变形)
把二叉搜索树转换为累加树 描述 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和. ...
- Java实现 LeetCode 538 把二叉搜索树转换为累加树(遍历树)
538. 把二叉搜索树转换为累加树 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和 ...
- Leetcode 538. 把二叉搜索树转换为累加树
题目链接 https://leetcode.com/problems/convert-bst-to-greater-tree/description/ 题目描述 大于它的节点值之和. 例如: 输入: ...
- [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 ...
- 538 Convert BST to Greater Tree 把二叉搜索树转换为累加树
给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和.例如:输入: 二叉搜索树: ...
- 【IT笔试面试题整理】二叉搜索树转换为双向链表
[试题描述] 将二叉搜索树转换为双向链表 对于二叉搜索树,可以将其转换为双向链表,其中,节点的左子树指针在链表中指向前一个节点,右子树指针在链表中指向后一个节点. 思路一: 采用递归思想,对于二叉搜索 ...
- 剑指Offer25 二叉搜索树转换为排序双向链表
/************************************************************************* > File Name: 25_BSTCon ...
- 从二叉搜索树到AVL树再到红黑树 B树
这几种树都属于数据结构中较为复杂的,在平时面试中,经常会问理解用法,但一般不会问具体的实现,所以今天来梳理一下这几种树之间的区别与联系,感谢知乎用户@Cailiang,这篇文章参考了他的专栏. 二叉查 ...
- Java实现 LeetCode 669 修剪二叉搜索树(遍历树)
669. 修剪二叉搜索树 给定一个二叉搜索树,同时给定最小边界L 和最大边界 R.通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) .你可能需要改变树的根节点,所以结果应当返回 ...
随机推荐
- ThinkPHP 跟踪日志设置、默认分组设置
跟踪日志: 做配置 ‘SHOW_PAGE_TRACE’ => true 默认分组: 做配置 ‘MODULE_ALLOW_LIST’ => array(‘Home’,’Admin’)
- zuul集成Sentinel最新的网关流控组件
一.说明 Sentinel 网关流控支持针对不同的路由和自定义的 API 分组进行流控,支持针对请求属性(如 URL 参数,Client IP,Header 等)进行流控.Sentinel 1.6.3 ...
- 性能测试学习第七天-----JMeter之linux环境部署篇
一.linux获取动态ip或静态ip: 1. virtualbox 加载linux虚拟机镜像文件,加载时重置全部网卡,加载后网络选择“桥接网络”--本机当前使用网卡: 2. ifconfig ...
- Java String引起的常量池、String类型传参、“==”、“equals”、“hashCode”问题 细节分析
在学习javase的过程中,总是会遇到关于String的各种细节问题,而这些问题往往会出现在Java攻城狮面试中,今天想写一篇随笔,简单记录下我的一些想法.话不多说,直接进入正题. 1.String常 ...
- mybatisX插件的使用
MybatisX 插件 快捷 mapper方法生成对应-----> mapper.xml中 :ALT +enter
- 设计模式(C#)——09外观模式
推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 前言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然 ...
- Codeforces 975C
题意略. 思路:这题考察的是二分搜索. #include<bits/stdc++.h> #define maxn 200005 using namespace std; typedef l ...
- C# - AutoMapper之不同类型的转换
一.Dto & Model约定 class TestDto { public string Name { get; set; } public int Age { get; set; } pu ...
- 《阿里巴巴Java开发手册1.4.0》阅读总结与心得(五)
笔者作为一名有数年工作经验的Java程序员,仔细研读了这份手册,觉得其是一份不可多得的好材料.阿里巴巴在发布时所说,“阿里巴巴集团推出的<阿里巴巴Java开发手册(正式版)>是阿里巴巴近万 ...
- Python字典排序问题
字典的问题 navagation: 1.问题来源 2.dict的学习 *3.numpy的应用 1.问题来源 在做cs231n,assigment1-kNN实现的时候,需要对一个列表中的元素进行计数,并 ...