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

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

示例 1:

输入:

  1. 1<br /> / \<br /> 3 2<br /> / \ \ <br /> 5 3 9

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

输入:

  1. 1<br /> / <br /> 3 <br /> / \ <br /> 5 3

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

输入:

  1. 1<br /> / \<br /> 3 2 <br /> / <br /> 5

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

输入:

  1. 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位有符号整数的表示范围内。

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. //根据满二叉树的性质,当前节点的左儿子是2n, 右儿子是2n+1
  18. public int widthOfBinaryTree(TreeNode root) {
  19. if (root == null) return 0;
  20. Deque<TreeNode> q = new LinkedList<>();
  21. q.addLast(root);
  22. root.val = 0;
  23. int res = 0;
  24. while (!q.isEmpty()) {
  25. int size = q.size();
  26. //用队头和队尾的差值更新res
  27. res = Math.max(res, q.peekLast().val - q.peekFirst().val + 1);
  28. while (size -- > 0) {
  29. TreeNode node = q.pollFirst();
  30. if (node.left != null) {
  31. node.left.val = node.val * 2;
  32. q.addLast(node.left);
  33. }
  34. if (node.right != null) {
  35. node.right.val = node.val * 2 + 1;
  36. q.addLast(node.right);
  37. }
  38. }
  39. }
  40. return res;
  41. }
  42. }

dfs