给你一棵二叉树的根节点 root ,返回树的 最大宽度 。
树的 最大宽度 是所有层中最大的 宽度 。
每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的 null 节点,这些 null 节点也计入长度。
题目数据保证答案将会在 32 位 带符号整数范围内。
来源:力扣(LeetCode)
思路:
本题可以使用广度优先搜索算法(BFS)将每一节点编上序号。
采用层序遍历将每一层宽度记录下来并比较。
答题过程中的问题:
1.Pair类:
之前没有用过这个类今天遇到简单查询应用一下。
使用场景
当我们在写一个方法需要返回两个字段值时,我之前的方法是新建一个类或使用集合。目前来看使用Pair方便很多。
配对(Pair)。配对提供了一种方便方式来处理简单的键值关联,当我们想从方法返回两个值时特别有用。
核心库对java配对的实现
Pair类在javafx.util 包中,类构造函数有两个参数,键及对应值:
import javafx.util.Pair;
Pair<Integer, String> pair = new Pair<>(1, "One");
Integer key = pair.getKey();
String value = pair.getValue();
Pair<Integer,String> p = new Pair(1,"1");
Integer o = p.getKey();
String v = p.getValue();
System.out.println("o:"+o);
System.out.println("v:"+v);
示例描述使用Pair类实现简单Integer到String的映射。示例中getKey方法返回key对象,getValue方法返回对应值对象。
代码解析:
初始化lenght =1将根结点存入由Pair类构成的father集合中,其中前一个Key存放节点,Value存放节点对应的序号;之后进行层序遍历将father层的下一层存入son中其中节点序号设置规则为:将根节点的值设为1;则下一层的节点的值=左:(父节点*2)或者右:(父节点*2+1)之后进行计算father.get(father.size()-1).getValue()-father.get(0).getValue()+1为该层宽度,则 length=Math.max(length,father.get(father.size()-1).getValue()-father.get(0).getValue()+1);为最大宽度。
/**
* 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 {
public int widthOfBinaryTree(TreeNode root) {
int length=1;
// 使用Pair类用于在一个;列表位置储存树的节点于其序号
List<Pair<TreeNode, Integer>> father =new ArrayList<Pair<TreeNode, Integer>>();
father.add(new Pair<TreeNode, Integer>(root,1));
// 动态判断father队列是否为空
while (!father.isEmpty()){
// 创建新的列表用于存放树的下一层
List<Pair<TreeNode, Integer>> son=new ArrayList<Pair<TreeNode, Integer>>();
for (Pair<TreeNode,Integer> test: father) {
// 用队列方法将新的层级储存在son中
if (test.getKey().left!=null){
// 将左节点为非空节点的节点于其父节点”序号“*2填加进下一层级
son.add(new Pair<TreeNode,Integer>(test.getKey().left,test.getValue()*2));
}
if (test.getKey().right!=null){
// 将右节点为非空节点的节点于其父节点”序号“*2+1填加进下一层级
// 最终形成类似于:
// 1
// 2 3
// 4 5 6 7
// 形式
son.add(new Pair<TreeNode,Integer>(test.getKey().right,test.getValue()*2+1));
}
}
// 判断本层于上一层宽度大小将大值赋给lenght
length=Math.max(length,father.get(father.size()-1).getValue()-father.get(0).getValue()+1);
father = son;
}
return length;
}
}