题目链接: LeetCode662二叉树最大宽度.
题目描述
解题思路
通过层序遍历,找出每层最左边的节点与最右边的节点之间的距离,并用此距离更新maxWidth。如何求解该距离时本题的关键。我们知道,对于二叉树而言,如果根节点从1开始编号,那么假设一个节点的编号是n,那么其左孩子编号就是2n,右孩子编号就是2n+1,根据次特征可以使用数组来存储二叉树,会方便得多,但是力扣已经定义了树节点结构,所以还是得用链式存储的相关写法。那么,虽然每个节点都有自己的val,但是这个val对题目求解最大宽度并无任何作用,所以可以按照上述做法对每个节点进行编号,根节点为1,然后2,3,4…对于每层,通过层序遍历进入到每层之前,取得该层最左边的节点的编号和最右边节点的编号,后者减去前者+1就是这层的距离。代码如下:
class Solution {
public int widthOfBinaryTree(TreeNode root) {
return bfs(root);
}
public int bfs(TreeNode root){
LinkedList<TreeNode> queue=new LinkedList<>();
int maxWidth=0;
root.val=1;
queue.offer(root);
int num=0;//num代表每一层的节点个数
int gap=0;
while(queue.size()>0){
num=queue.size();//本层节点个数(重点!!!!!!!!!!!!)
gap=queue.getLast().val-queue.getFirst().val+1;//本层间距
maxWidth=Math.max(gap,maxWidth);
for(int i=1;i<=num;++i){//遍历本层所有节点
TreeNode node=queue.poll();//一定要poll去除队首元素,这样上面的queue.size()才是每一层元素的个数
if(node.left!=null){
node.left.val=2*node.val;
queue.add(node.left);
}
if(node.right!=null){
node.right.val=2*node.val+1;
queue.add(node.right);
}
}
}
return maxWidth;
}
}