我用java刷 leetcode 662. 二叉树最大宽度

Posted 深林无鹿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我用java刷 leetcode 662. 二叉树最大宽度相关的知识,希望对你有一定的参考价值。

这里有leetcode题集分类整理!!!

题目难度:中等
题目描述:

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

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

样例 1:

输入:

       1
     /   \\
    3     2
   / \\     \\  
  5   3     9 

输出: 4
解释: 最大值出现在树的第 3 层,宽度为 4 (5,3,null,9)。
样例 2:

输入:

      1
     /  
    3    
   / \\       
  5   3     

输出: 2
解释: 最大值出现在树的第 3 层,宽度为 2 (5,3)。
样例 3:

输入:

      1
     / \\
    3   2 
   /        
  5      

输出: 2
解释: 最大值出现在树的第 2 层,宽度为 2 (3,2)。
样例 4:

输入:

      1
     / \\
    3   2
   /     \\  
  5       9 
 /         \\
6           7

输出: 8
解释: 最大值出现在树的第 4 层,宽度为 8 (6,null,null,null,null,null,null,7)。
注意: 答案在32位有符号整数的表示范围内。

总结:
以下两种BFS实现方法均是较好的解决思路

BFS 官解AC (2-3ms):

想法和算法
宽度优先搜索顺序遍历每个节点的过程中,我们记录节点的 position 信息,对于每一个深度,第一个遇到的节点是最左边的节点,最后一个到达的节点是最右边的节点。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int widthOfBinaryTree(TreeNode root) {
        Queue<AnnotatedNode> queue = new LinkedList<>();
        queue.offer(new AnnotatedNode(root, 0, 0));
        int currDepth = 0, left = 0, res = 0;
        while (!queue.isEmpty()) {
            AnnotatedNode annotatedNode = queue.poll();
            if(annotatedNode.node != null) {
                queue.offer(new AnnotatedNode(annotatedNode.node.left, annotatedNode.depth + 1, 2 *  annotatedNode.pos ));
                queue.offer(new AnnotatedNode(annotatedNode.node.right, annotatedNode.depth + 1, 2 * annotatedNode.pos + 1));
                if (currDepth != annotatedNode.depth) {
                    currDepth = annotatedNode.depth;
                    left = annotatedNode.pos;
                }
                res = Math.max(res, annotatedNode.pos - left + 1);
            }
        }
        return res;
    }
}

class AnnotatedNode {
    TreeNode node;
    int depth, pos;
    AnnotatedNode(TreeNode n, int d, int p) {
        node = n;
        depth = d;
        pos = p;
    }
}

1ms BFS:
思路:
直接原地修改节点的 val 用来存储满二叉树中的编号

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int widthOfBinaryTree(TreeNode root) {
        if (root == null) {
            return 0;
        }
        LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
        queue.add(root);
        int maxWidth = 0;
        while (!queue.isEmpty()) {
            int width = queue.size();
            maxWidth = Math.max(maxWidth, queue.getLast().val - queue.getFirst().val + 1);
            while (width > 0) {
                width--;
                TreeNode node = queue.remove();
                if (node.left != null) {
                    node.left.val = node.val * 2 + 1;
                    queue.add(node.left);
                }
                if (node.right != null) {
                    node.right.val = node.val * 2 + 2;
                    queue.add(node.right);
                } 

            }
        }
        return maxWidth;
    }
}

以上是关于我用java刷 leetcode 662. 二叉树最大宽度的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode Java刷题笔记—662. 二叉树最大宽度

Leetcode刷题100天—662. 二叉树最大宽度(二叉树)—day09

LeetCode662 二叉树最大宽度

LeetCode每日一题:662二叉树最大宽度

LeetCode 662. 二叉树最大宽度

我用java刷 leetcode 872. 叶子相似的树