0x00 题目
给定一个二叉树,计算整个树的坡度
一个树的 节点的坡度 定义为,该节点 左 子树的节点之和 与 右 子树节点之和 的 差的绝对值
如果没有左子树的话,左子树的节点之和为 0 ,没有右子树的话也是一样
空结点的坡度是 0 ,整个树的坡度就是其所有节点的 坡度之和
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 findTilt(_ root: TreeNode?) -> Int {
// 坡度之和
var sum = 0
func dfs(_ root: TreeNode?) -> Int {
// 根据定义,空结点的坡度是 0
guard let root = root else { return 0 }
// 左子树之和
let left = dfs(root.left)
// 右子树之和
let right = dfs(root.right)
// 求坡度,差就是坡度
sum += abs(left - right)
// 返回当前节点之和,给上层使用
return root.val + left + right
}
// 遍历
dfs(root)
// 坡度
return sum
}
0x03 我的小作品
欢迎体验我的作品之一:小五笔
五笔学习好帮手!
App Store 搜索即可~