给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。
每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。
示例 1:
输入:
1<br /> / \<br /> 3 2<br /> / \ \ <br /> 5 3 9
输出: 4
解释: 最大值出现在树的第 3 层,宽度为 4 (5,3,null,9)。
示例 2:
输入:
1<br /> / <br /> 3 <br /> / \ <br /> 5 3
输出: 2
解释: 最大值出现在树的第 3 层,宽度为 2 (5,3)。
示例 3:
输入:
1<br /> / \<br /> 3 2 <br /> / <br /> 5
输出: 2
解释: 最大值出现在树的第 2 层,宽度为 2 (3,2)。
示例 4:
输入:
1<br /> / \<br /> 3 2<br /> / \ <br /> 5 9 <br /> / \<br /> 6 7<br />输出: 8<br />解释: 最大值出现在树的第 4 层,宽度为 8 (6,null,null,null,null,null,null,7)。<br />注意: 答案在32位有符号整数的表示范围内。
/*** 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 {//根据满二叉树的性质,当前节点的左儿子是2n, 右儿子是2n+1public int widthOfBinaryTree(TreeNode root) {if (root == null) return 0;Deque<TreeNode> q = new LinkedList<>();q.addLast(root);root.val = 0;int res = 0;while (!q.isEmpty()) {int size = q.size();//用队头和队尾的差值更新resres = Math.max(res, q.peekLast().val - q.peekFirst().val + 1);while (size -- > 0) {TreeNode node = q.pollFirst();if (node.left != null) {node.left.val = node.val * 2;q.addLast(node.left);}if (node.right != null) {node.right.val = node.val * 2 + 1;q.addLast(node.right);}}}return res;}}
dfs
/*** 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 {/**递归的时候传入位置信息,然后map存储每一层最先到达的点,即最左边的下标,维护res即可*/Map<Integer, Integer> map = new HashMap<>();int res;public int widthOfBinaryTree(TreeNode root) {if (root == null) return 0;dfs(root, 0, 0);return res;}//depth:深度, pos位置void dfs(TreeNode root, int depth, int pos) {if (root == null) return;//只有在第一次访问才存位置if (!map.containsKey(depth)) map.put(depth, pos);res = Math.max(res, pos - map.get(depth) + 1);dfs(root.left, depth + 1, pos * 2);dfs(root.right, depth + 1, pos * 2 + 1);}}
