LeetCode 1038. 把二叉搜索树转换为累加树

这篇博客介绍了如何将一个二叉搜索树转换为累加树,累加树的性质是每个节点的值等于大于等于其值的所有元素之和。解题关键在于利用二叉搜索树的逆中序遍历,通过递归更新节点值。作者提供了详细的解题思路和Java代码实现。
摘要由CSDN通过智能技术生成

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);    
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值