AC
package 二叉树;
import 二叉树.二叉树展开为链表.TreeNode;
import java.util.ArrayDeque;
import java.util.Deque;
public class 二叉树的最大宽度 {
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;
}
}
public int widthOfBinaryTree(TreeNode root) {
if(root==null) {
return 0;
}
int ans=Integer.MIN_VALUE;
Deque<TreeNode> queue=new ArrayDeque<TreeNode>();
queue.add(root);
while (!queue.isEmpty()){
int size=queue.size();
ans=Math.max(ans,queue.getLast().val-queue.getFirst().val+1);
for (int i = 0; i <size ; i++) {
TreeNode node=queue.poll();
if(node.left!=null){
queue.add(node.left);
node.left.val=node.val*2;
}
if(node.right!=null){
queue.add(node.right);
node.right.val=node.val*2+1;
}
}
}
return ans;
}
}
思路:
1 首先想到了层次遍历 所以要会层次遍历的想法 建议多敲几遍
2 一开始我在想null该怎么存 怎么表示第一个点 和 最后一个点
3 后来看了题解 他用了值来表示 这样就不用算多少null了 太聪明了
父节点 *2,*2+1
4 最后又看了看递归做法
package 二叉树;
import 二叉树.二叉树展开为链表.TreeNode;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashMap;
import java.util.Map;
public class 二叉树的最大宽度 {
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;
}
}
int ans;
Map<Integer, Integer> left;
public int widthOfBinaryTree2(TreeNode root) {
if(root==null) {
return 0;
}
ans=0;
left=new HashMap<>();
dfs(root,0,0);
return ans;
}
public void dfs(TreeNode root,int depth,int pos){
if(root==null){
return;
}
left.computeIfAbsent(depth,x->pos);
ans=Math.max(ans,pos-left.get(depth)+1);
dfs(root.left,depth+1,pos*2);
dfs(root.right,depth+1,pos*2+1);
}
}
解释一下下面这句话:
我们可以先去他的底层源码看一下:
可以看到第二个参数是function接口(也就是函数式接口)(有参数也有返回值的接口)(因为一个接口中只有一个抽象类方法,所以重写可以直接使用lamda)
下图参考一些基础的函数式接口重写方法:
到这里你能明白为什么这么写了吗!
x是参数,pos是返回值,其实这里写的还是太过简洁了
正常的话这么写:
ps:补充