题目:
将一个二叉搜索树的每个节点值都重新赋值为:这棵树中所有大于等于当前节点值的所有值之和。
思路:
首先我们要明白二叉搜索树的定义:
- 每个节点
node
如果有左子树,那么左子树的所有节点值一定都小于当前节点值node.val
- 每个节点
node
如果有右子树,那么右子树的所有节点值一定都大于当前节点值node.val
结合中序遍历
的特点:左子树,根节点,右子树。
那么中序遍历整个二叉搜索树,得到的就会是一个递增序列,而每一个节点所更新的值其实就是递增序列中当前值后面的所有值之和,因此,我们现在要做的就是求这些值的和,怎么求?
我们可以反过来想
如果我倒着中序遍历一遍,也就是顺序变为:右子树,根节点,左子树,那么得到的序列就是一个递减序列。与此同时,我们可以在遍历的时候维护一个变量sum
,这样从大到小遍历,遍历到当前值的时候,我们就已经通过变量sum
知道了比它大的所有节点的和,只需要重新赋值即可
以下为代码+注释:
//定义TreeNode节点
class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode(int val){
this.val = val;
}
}
//记录比当前节点大的所有值之和
int sum = 0;
public TreeNode convertBST(TreeNode root) {
// 反序中序遍历,遍历过程中记录当前遍历过节点的总和
if(root != null){
convertBST(root.right);
//将节点自身也要加上
sum += root.val;
//重新对当前节点赋值
root.val = sum;
convertBST(root.left);
}
//最后返回根节点
return root;
}
笔者也在不断学习中,如果错误,欢迎指正!