二叉树最大宽度
题目(力扣662题)
给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。
每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。
解题思路:深度优先搜索
1,根据深度优先的顺序,先使用Map记录每个节点的pos,对于每一个深度,第一个到达的位置会被记录在 left[depth] 中。
2,然后对于每一个节点,它对应这一层的可能宽度是 pos -left[depth] + 1 。我们将每一层这些可能的宽度取一个最大值就是最大宽度。
代码实现
int ret;//创建一个存放结果的变量
Map<Integer, Integer> left;
//求二叉树最大宽度
public int widthOfBinaryTree(TreeNode root) {
ret = 0;
left = new HashMap();
dfs(root,0,0);
return ret;
}
public void dfs(TreeNode root, int depth, int pos) {
if(root == null){
return;
}
//添加最左侧的元素,当第一次走到某一层的时候,此时Map里面是空,更新一次位置信息。
left.computeIfAbsent(depth, x -> pos);
//计算当前结点跟最左侧结点位置的距离,并更新最大值
ret = Math.max(ret,pos - left.get(depth)+1);
dfs(root.left,depth+1,2*pos);
dfs(root.right,depth+1,2*pos + 1);
}