题目来源:
https://leetcode-cn.com/problems/maximum-width-of-binary-tree/
题目描述:
代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private int maxWidth = 0;
public int widthOfBinaryTree(TreeNode root) {
dfs(root, 1, 1, new ArrayList<>());
return maxWidth;
}
/**
* 假设满二叉树表示成数组序列, 根节点所在的位置为1,
* 则任意位于i节点的左右子节点的index为2*i, 2*i+1。
* 用一个List保存每层的左端点,易知二叉树有多少层List的元素就有多少个。
* 那么可以在dfs的过程中记录每个节点的index及其所在的层level,
* 如果level>List.size()说明当前节点就是新的一层的最左节点, 将其 加入List中,
* 否则判断当前节点的index减去List中对应层的最左节点的index的宽度是否大于最大宽度并更新
**/
private void dfs(TreeNode root, int level, int index, List<Integer> list) {
if (root == null)
return;
if (level > list.size())
list.add(index);
maxWidth = Math.max(maxWidth, index - list.get(level - 1) + 1);
// 遍历左子树
dfs(root.left, level + 1, index * 2, list);
// 遍历右子树
dfs(root.right, level + 1, index * 2 + 1, list);
}
}