一、思路
示例
此题我们可以利用二叉树的层次遍历去做,思路如下
- 给二叉树从根节点开始编号,根节点编号为1,其左子节点则为 2 *1 ,右子节点则为2 * 1 +1。
- 层次遍历,遍历每层时,都要统计该层最大宽度,即最大序号 - 最小序号 + 1。
- 比较出所有层最大的宽度返回。
二、代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int widthOfBinaryTree(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
List<Integer> orderList = new LinkedList<>();//序号列表,和节点一一对应,默认根节点序号为
queue.offer(root);
orderList.add(1);
// Integer order = 0;
int result = 1;
while(!queue.isEmpty()){
int size = queue.size();
for(int i = 0; i < size; i++){//代表了一层
TreeNode element = queue.poll();
Integer order = orderList.remove(0);
// Integer order = orderList.removeFirst();
if(element.left != null){
queue.offer(element.left);
orderList.add(order * 2);
}
if(element.right != null){
queue.offer(element.right);
orderList.add(order * 2 + 1);
}
}
if(orderList.size() >= 1 && result < (orderList.get(orderList.size() - 1) - orderList.get(0) + 1)){
result = orderList.get(orderList.size() - 1) - orderList.get(0) + 1;
}
// if(result < (orderList.getLast() - orderList.getFirst() + 1)){
// result = orderList.getLast() - orderList.getFirst() + 1;
// }
}
return result;
}
}