二叉树最大宽度

题目

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

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

解题

思路

一个二叉树,从根节点开始,从0开始,一次往后编码,1、2、3、4…

这样每一个根节点i的左子节点都是2 * i + 1;右子节点都是2 * i + 2;

再利用队列进行bfs,每一行的最大值减去最小值加一就是这个二叉树的最大宽度。

时间复杂度为O(n),空间复杂度也是O(n)。

代码

class Solution {
    public int widthOfBinaryTree(TreeNode root) {

        if (root == null) {
            return 0;
        }
        
        LinkedList<TreeNode> queue = new LinkedList<>();
        root.val = 0;
        queue.add(root);

        int result = 0;
        while (!queue.isEmpty()) {
            if (queue.getLast().val - queue.getFirst().val + 1 > result) {
                result = queue.getLast().val - queue.getFirst().val + 1;
            }
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                TreeNode temp = queue.poll();
                if (temp.left != null) {
                    temp.left.val = temp.val * 2 + 1;
                    queue.add(temp.left);
                }
                if (temp.right != null) {
                    temp.right.val = temp.val * 2 + 2;
                    queue.add(temp.right);
                }
            }
        }

        return result;
    }
}