【二叉树】二叉树的坡度
原创
©著作权归作者所有:来自51CTO博客作者haocold的原创作品,请联系作者获取转载授权,否则将追究法律责任
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
}
小编辑器
小而巧~