[LeetCode] 662. Maximum Width of Binary Tree

Given the root of a binary tree, return the maximum width of the given tree.

The maximum width of a tree is the maximum width among all levels.

The width of one level is defined as the length between the end-nodes (the leftmost and rightmost non-null nodes), where the null nodes between the end-nodes that would be present in a complete binary tree extending down to that level are also counted into the length calculation.

It is guaranteed that the answer will in the range of a 32-bit signed integer.

Example 1:

Input: root = [1,3,2,5,3,null,9]
Output: 4
Explanation: The maximum width exists in the third level with length 4 (5,3,null,9).

Example 2:

Input: root = [1,3,2,5,null,null,9,6,null,7]
Output: 7
Explanation: The maximum width exists in the fourth level with length 7 (6,null,null,null,null,null,7).

Example 3:

Input: root = [1,3,2,5]
Output: 2
Explanation: The maximum width exists in the second level with length 2 (3,2).

Constraints:

  • The number of nodes in the tree is in the range [1, 3000].
  • -100 <= Node.val <= 100

二叉树的最大宽度。

给你一棵二叉树的根节点 root ,返回树的 最大宽度 。

树的 最大宽度 是所有层中最大的 宽度 。

每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的 null 节点,这些 null 节点也计入长度。

题目数据保证答案将会在  32 位 带符号整数范围内。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/maximum-width-of-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题意是给一个结构近似于满二叉树 complete binary tree 的二叉树,请你返回他的最大宽度是多少。

题目中有一句话非常关键,这个树近似于一棵满二叉树。我们需要回忆满二叉树的特点,满二叉树除了最底层,每一层都是满的,如果最后一层不满足,那么也一定是从左往右尽量排满的。对于一棵满二叉树,对于任意一个父节点,如果这个父节点的 index = n 的话,这个节点的两个孩子的 index 则分别是 2n 和 2n + 1。这个画一下就知道了。

那么这道题的具体思路是,在进行常规的 BFS 遍历的同时,我们还需要另外一个 queue 来记录每个节点的 index。遍历每一层的时候,我们需要计算一下当前层的第一个节点和最后一个节点的index的差,这个差值就是题目所求的最大宽度。

时间O(n)

空间O(n)

Java实现

 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 class Solution {
11     public int widthOfBinaryTree(TreeNode root) {
12         // corner case
13         if (root == null) {
14             return 0;
15         }
16 
17         // normal case
18         Queue<TreeNode> queue = new LinkedList<>();
19         LinkedList<Integer> list = new LinkedList<>();
20         int res = 1;
21         queue.offer(root);
22         list.add(1);
23         while (!queue.isEmpty()) {
24             int count = queue.size();
25             for (int i = 0; i < count; i++) {
26                 TreeNode cur = queue.poll();
27                 int curIndex = list.removeFirst();
28                 if (cur.left != null) {
29                     queue.offer(cur.left);
30                     list.offer(curIndex * 2);
31                 }
32                 if (cur.right != null) {
33                     queue.offer(cur.right);
34                     list.offer(curIndex * 2 + 1);
35                 }
36             }
37             if (list.size() >= 2) {
38                 res = Math.max(res, list.peekLast() - list.peekFirst() + 1);
39             }
40         }
41         return res;
42     }
43 }

 

LeetCode 题目总结

posted @ 2020-07-10 06:15  CNoodle  阅读(166)  评论(0编辑  收藏  举报