LeetCode BST专题 538 把二叉搜索树转换成累加树 java
程序员文章站
2022-06-07 14:46:25
...
题目详情
给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。
解题思路及代码
本题是BST,关于BST我们要明确一点,中序遍历是输出从小到大的有序数列。(关于中序遍历,BST可以看二叉树(& BST)的前序、中序、后序遍历,递归与迭代,java)
然后我们这里每个点的新值是当前值+所有大于当前值的值,若我们有一个有序数列,则该点的新值为:从旧值开始,一直累加到尾。
当然,我们不存在先中序遍历一遍,然后再访问数组,再去遍历一遍修改,这样太麻烦了。
我们直接从有序数列的最后一个往前累加,累加到旧值。
如何从后往前走呢? 只需将中序遍历翻转一下即可。
在中序遍历时,我们是
void dfs(TreeNode root) {
dfs(root.left);
visit(root);
dfs(root.right);
}
这里我们反一下,先放right,后放left即可。
具体代码如下:
class Solution {
private int sum = 0;
public TreeNode convertBST(TreeNode root) {
//每个数的新值就是其父节点、父节点的右子树(如果有父节点的话)+右子节点的和
//中序遍历的话是从小到大的有序对吧,如果我把中序的左和右改一下,是不是就是从大到小遍历了
//然后每个点的值就是自己+之前的sum
//应该就是这样
// int sum = 0;
dfs(root);
return root;
}
public void dfs(TreeNode node){
if(node==null){
return;
}
dfs(node.right);
sum += node.val;
node.val = sum;
dfs(node.left);
return;
}
}