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
搜索即可~