leetcode 662. 二叉树最大宽度
给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(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)。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-width-of-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
采用层序遍历,每次遍历都记录一下当前节点的索引位置。用last -first就是所求。
/** * 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) { LinkedList<TreeNode> a = new LinkedList<>(); LinkedList<Integer> a1 = new LinkedList<>(); LinkedList<TreeNode> b = new LinkedList<>(); LinkedList<Integer> b1 = new LinkedList<>(); a.add(root); a1.add(0); int max = 1; while (!a.isEmpty()) { while (!a.isEmpty()) { TreeNode poll = a.poll(); int index = a1.poll(); if (poll.left != null) { b.add(poll.left); b1.add((index << 1)); } if (poll.right != null) { b.add(poll.right); b1.add((index << 1) + 1); } } if (!b.isEmpty()) { max = Math.max(max, b1.getLast() - b1.getFirst() + 1); } a = b; a1 = b1; b = new LinkedList<>(); b1 = new LinkedList<>(); } return max; } }