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
小程序
五笔学习好帮手
微信
搜索即可~