0
点赞
收藏
分享

微信扫一扫

【二叉树】二叉树最大宽度


0x00 题目

给定一个二叉树
编写一个函数来获取这个树的 ​​​最大宽度​​​ 树的宽度是 ​​所有层​​ 中的最大宽度
这个二叉树与满二叉树(full binary tree)结构相同
但一些节点为空

每一层的宽度被定义为两个端点之间的长度
该层最左和最右的非空节点
两端点间的 ​​​null​​ 节点也计入长度

0x01 思路

二叉树
第一层最多 ​​​1​​​ 个节点
第二层最多 ​​​2​​​ 个节点
第三层最多 ​​​4​​​ 个节点
第 N 层最多 ​​​2^(N-1)​​ 个节点

要求出某层的最大宽度
就要找出​​​最左边​​​和​​最右边​​​的节点
如果给节点​​​编号​​​ 就能根据编号的​​差值​​求出宽度

【二叉树】二叉树最大宽度_swift

二叉树的 ​​位置索引​​​ 标记如图
关键点:去掉 ​​​任意的​​​ 节点,不影响其他节点的位置索引
当前节点的位置索引假设为 ​​​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​​​ 小程序
五笔学习好帮手
​​​微信​​ 搜索即可~


举报

相关推荐

0 条评论