【二叉树】二叉树的坡度

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
}

小编辑器

小而巧~
请添加图片描述


Guess you like

Origin blog.csdn.net/xjh093/article/details/121742855