2022年 第一题 后续遍历 把二叉搜索树转换为累加树

91 阅读2分钟

题目描述


这是leetocde的 538. 把二叉搜索树转换为累加树,难度为中等

给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

提醒一下,二叉搜索树满足下列约束条件:

节点的左子树仅包含键 小于 节点键的节点。

节点的右子树仅包含键 大于 节点键的节点。

左右子树也必须是二叉搜索树。

注意:本题和 1038: leetcode-cn.com/problems/bi… 相同

 

示例 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]

 

提示:

树中的节点数介于 0 和 104 之间。

每个节点的值介于 -104 和 104 之间。

树中的所有值 互不相同 。

给定的树为二叉搜索树。

来源:力扣(LeetCode)

链接:leetcode-cn.com/problems/co…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

算法实现


/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {TreeNode}
 */
var convertBST = function(root) {
    //17点35分 本题就是求出原来树中的每一个节点,大于该节点的所有节点之和,然后进行更新,所加之和有包含自身的值
    //后序遍历,就是从右边来时,从大的开始进行,一个节点会等于右上点之和,加上右下点之和
    //对于大的点的话, 它的值等于左上点加上左下点 17点42分
    // var shenru = function(rootNode){
    //     if(!rootNode.right && !rootNode.left) return rootNode.val
    //     rootNode.val += shenru(rootNode.right)
    // }
    // shenru(root)
    //17点50分 想不出
    
    //17点53分 看了解析后明白了,就是后序遍历,然后按照后续遍历的顺序,把每一个数进行相加最后求出结果
    var sum = 0
    var shenru = (rootNode) => {
        if(!rootNode) return
        shenru(rootNode.right)
        rootNode.val += sum
        sum = rootNode.val
        shenru(rootNode.left)
    }
    shenru(root)
    return root
};
  • 时间复杂度: O(n)
  • 空间复杂度: O(n)

最后


这是我2022年分享的「leetcode」第NO.1篇文章。