0x00 题目
给定一个二叉树
编写一个函数来获取这个树的 最大宽度 树的宽度是 所有层 中的最大宽度
这个二叉树与满二叉树(full binary tree)结构相同
但一些节点为空
每一层的宽度被定义为两个端点之间的长度
该层最左和最右的非空节点
两端点间的 null 节点也计入长度
0x01 思路
二叉树
第一层最多 1 个节点
第二层最多 2 个节点
第三层最多 4 个节点
第 N 层最多 2^(N-1) 个节点
要求出某层的最大宽度
就要找出最左边和最右边的节点
如果给节点编号 就能根据编号的差值求出宽度

二叉树的 位置索引 标记如图
关键点:去掉 任意的 节点,不影响其他节点的位置索引
当前节点的位置索引假设为 1,
那 左节点 的位置索引为 1 x 2右节点 为 1 x 2 + 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 widthOfBinaryTree(_ root: TreeNode?) -> Int {
guard let root = root else { return 0 }
// 使用元组来存储节点,与编号
var queue: [(TreeNode, Int)] = []
queue.append((root, 1))
var maxWidth = 1
while !queue.isEmpty {
let count = queue.count
for _ in 0..<count {
let cur = queue.removeFirst()
let node = cur.0
let index = cur.1
if let left = node.left {
queue.append((left, index &* 2))
}
if let right = node.right {
queue.append((right, index &* 2 + 1))
}
}
if !queue.isEmpty {
maxWidth = max(maxWidth, queue.last!.1 &- queue.first!.1 + 1)
}
}
return maxWidth
}0x03 我的作品
欢迎体验我的作品之一:Xwubi 小程序
五笔学习好帮手
微信 搜索即可~









