1038. 把二叉搜索树转换为累加树
题目
给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(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]
提示:
树中的节点数介于 1 和 100 之间。
每个节点的值介于 0 和 100 之间。
树中的所有值 互不相同 。
给定的树为二叉搜索树。
原题链接,仅供学习交流,如果侵权,联系博主删除
解题思路
1.题目给出两个关键信息
1.原来的树为二叉搜索树 ==> 首先明白二叉搜索树的性质
二叉搜索树的性质有:
1、对于 BST 的每一个节点node,左子树节点的值都比node的值要小,右子树节点的值都比node的值大。
2、对于 BST 的每一个节点node,它的左侧子树和右侧子树都是 BST。
从做算法题的角度来看 BST,除了它的定义,还有一个重要的性质:BST 的中序遍历结果是有序的(升序)。
2.明白 累加树(Greater Sum Tree)是什么?有什么性质
累加树的性质是 :累加和
是计算大于等于当前值
的所有元素之和
解释一下:
如下图:
节点8 的 累加树的值 = (>=8的值的所有元素 的 和
)
很明显 >=8的 节点只有他本身,所以为 8
节点4 的 累计树的值 = (>=4的值的所有元素 的 和
)
如图: 有 节点 6 5 7 8
和自己 4
所以 = 4+5+6+7+8
= 30
节点1 的 累计树的值 = (>=1的值的所有元素 的 和
)
如图: 有 节点 2 3 4 5 6 7 8
和自己1
所以 = 1+2+3+4+5+6+7+8
= 36
规律来了
节点4 的 累加树值为 自己右子树的所有的节点的值加上自己本身
节点1 的 累加树值为 自己 + 自己右子树的累加值 + 自己的根节点的累加树值
这他瞄的不就是二叉树的递归
所以转化为代码就是:
二叉搜索树的 逆中序遍历
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
/*** 累加树的性质 : 累加和是计算大于等于当前值的所有元素之和 ***/
class Solution {
public TreeNode bstToGst(TreeNode root) {
gst(root);
return root;
}
// 记录累加和
int sum = 0;
public void gst(TreeNode root){
/*** Base Code ***/
if(root == null) return ;
gst(root.right);
/*** 逆中序遍历 ***/
sum+=root.val;
root.val= sum;
gst(root.left);
}
}