Leetcode 538. 把二叉搜索树转换为累加树

152 阅读2分钟

“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”

今天写了二叉树的中序遍历,所以打算把热题100中关于二叉树的题,都解一遍,方便大家专项学习

一、题目描述

  • 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。提醒一下,二叉搜索树满足下列约束条件:节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右子树也必须是二叉搜索树。注意:本题和 1038: leetcode-cn.com/problems/bi… 相同

二、思路分析

  • 所谓二叉搜索树:左子树小于根,根需要小于右子树

  • 题意中可知累加树是从右节点根节点左节点

  • 所以我们定义一个变量用于累加

  • 每次从右节点开始累加依次加父节点和左节点同时更新变量

三、AC 代码:

class Solution {
    //定义变量
    int sum = 0;
    public TreeNode convertBST(TreeNode root) {
        //累加的函数
        myOrder(root);
        return root;
    }
    public void myOrder(TreeNode root){
        //边界条件
        if(root == null){
            return;
        }
        //递归右节点
        myOrder(root.right);
        //更新变量值用于下次累加
        int temp = sum;
        //加上根节点
        sum += root.val;
        root.val += temp;
        //加上左节点
        myOrder(root.left);
    }

}

四、总结:

  • 好了,代码撸完,我们总结一下
    • 递归调用

    • 搜索树的概念:左子树小于根,根需要小于右子树

    • 从右到中到左的顺序累加

最后这个算法是Leetcode的第538题,是热题100里的题,去年我刷了热题100用时一个月左右,接下来我会继续更新,小伙伴可以点赞关注,如果你也在刷热题100的话,希望可以对你有一些启发!