【二叉树】把二叉搜索树转换为累加树

0x00 题目

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

或者是

将它的每个节点的值
替换成树中 大于 或者 等于
该节点值的 所有 节点值之和

示例:
看图
请添加图片描述


0x01 思路

原树中最大的节点值在 最右边
当前节点的值为 从后往前累加值
二叉搜索树,使用中序 遍历
右子树开始
得到一个递减的序列


0x02 解法

语言:Swift

树节点:TreeNode

public class TreeNode {
    public var val: Int
    public var left: TreeNode?
    public var right: TreeNode?
    public init() { self.val = 0; self.left = nil; self.right = nil; }
    public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
    public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
        self.val = val
        self.left = left
        self.right = right
    }
}

解法一:
一边遍历,一边 更新 当前节点值

func bstToGst(_ root: TreeNode?) -> TreeNode? {

    func dfs(_ root: TreeNode?, val: Int) -> Int {
        guard let root = root else { return val }
        
        let right = dfs(root.right, val: val)
        
        // 中序遍历位置
        let sum = right + root.val
        root.val = sum
        
        let left = dfs(root.left, val: sum)
        
        return left
    }
    
    _ = dfs(root, val: 0)
    
    return root
}

解法二:
先放在数据中,再更新节点值

func bstToGst(_ root: TreeNode?) -> TreeNode? {
    var arr:[TreeNode] = []
    
    func dfs(_ root: TreeNode?) {
        guard let root = root else { return }
        
        dfs(root.right)
        arr.append(root)
        dfs(root.left)
    }
    
    dfs(root)
    
    for i in 1..<arr.count {
        arr[i].val += arr[i-1].val
    }
    
    return root
}

0x03 我的作品

欢迎体验我的作品之一:小五笔 86 版
五笔学习好帮手~
App Store 搜索即可~


猜你喜欢

转载自blog.csdn.net/xjh093/article/details/124491605
今日推荐