给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。
每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。
示例 1:
输入:
1
/ \
3 2
/ \ \
5 3 9
输出: 4
解释: 最大值出现在树的第 3 层,宽度为 4 (5,3,null,9)。
示例 2:
输入:
1
/
3
/ \
5 3
输出: 2
解释: 最大值出现在树的第 3 层,宽度为 2 (5,3)。
示例 3:
输入:
1
/ \
3 2
/
5
输出: 2
解释: 最大值出现在树的第 2 层,宽度为 2 (3,2)。
示例 4:
输入:
1
/ \
3 2
/ \
5 9
/ \
6 7
输出: 8
解释: 最大值出现在树的第 4 层,宽度为 8 (6,null,null,null,null,null,null,7)。
思路:
层序的思想 每一层记录最左位置left 在同一层更新res的值 具体看代码
public static class ReturnType {
TreeNode node;
int depth;
int pos; //深度 位置
ReturnType(TreeNode n, int d, int p) {
node = n;
depth = d;
pos = p;
}
}
public int widthOfBinaryTree(TreeNode root) {
Queue<ReturnType> queue = new LinkedList();
//初始化 加入第0层
queue.add(new ReturnType(root, 0, 0));
int curDepth = 0;
int left = 0;
int res = 0;
while (!queue.isEmpty()) {
ReturnType cur = queue.poll();
if (cur.node != null) {
//加入左右孩子
queue.add(new ReturnType(cur.node.left, cur.depth + 1, cur.pos * 2));
queue.add(new ReturnType(cur.node.right, cur.depth + 1, cur.pos * 2 + 1));
//来到下一层第一个的的时候进行更新
if (curDepth != cur.depth) {
curDepth = cur.depth;
left = cur.pos;
}
res = Math.max(res, cur.pos - left + 1);
}
}
return res;
}