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
}

小编辑器

小而巧~