维护两个队列, 一个是node, 一个是这个node在一个完全二叉树中的位置, 每层记录最左边的节点和最右边的节点的位置, 计算ans
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| 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.left == null && root.right == null) return 1; int ans = 0; Deque<TreeNode> que = new ArrayDeque<>(); Deque<Integer> pos = new ArrayDeque<>(); que.addLast(root); pos.addLast(1); while (!que.isEmpty()) { int size = que.size(); int left = -1; int right = -1; for (int i = 0; i < size; i++) { TreeNode node = que.removeFirst(); int p = pos.removeFirst(); if (node.left != null) { que.add(node.left); pos.add(p*2+1); } if (node.right != null) { que.add(node.right); pos.add(p*2+2); } if (left == -1) left = p; right = p;
} ans = Math.max(ans, right - left + 1); } return ans; } }
|