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

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


猜你喜欢

转载自blog.csdn.net/xjh093/article/details/125080783
今日推荐