0x00 题目

给你一棵二叉树,计算它的​​直径长度​​​ 一棵二叉树的直径长度是:
任意两个结点​​路径长度​​中的​​最大​​值
这条路径可能穿过也可能不穿过根结点

示例:
有这样一棵二叉树

          1
/ \
2 3
/ \
4 5

返回结果:3
它的长度是路径 ​​​[4,2,1,3]​​​ 或者 ​​[5,2,1,3]​


0x01 思路

经过 ​​某个节点​​​ 的最大路径是:
​​​左​​​子树最大高度 + ​​右​​​子树最大高度 + ​​1​​​ 所以采用【后序遍历】的方式
记录一个最大值,并同时更新

为什么要采用【后序遍历】呢?
因为这种方式可以得到:
​​​左​​​子树最大高度

​​​右​​子树最大高度


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 diameterOfBinaryTree(_ root: TreeNode?) -> Int {
// 记录长度
var res = 0

func dfs(_ root: TreeNode?) -> Int {
// 为空,则返回 0
guard let root = root else { return 0 }

// 左子树最大高度 let left = dfs(root.left)

// 右子树最大高度
let right = dfs(root.right)

// 更新最大值
res = max(res, left + right + 1)

// 该节点的最大高度
return max(left, right) + 1
}

dfs(root)

// 减 1,是因为一个节点计算左、右高度时,计算了 2 次
return res - 1
}

公众号(​​Haomissyou​​)文章一起食用,效果更佳~


【二叉树】二叉树的直径_深度优先