leecode 2385.感染二叉树需要的总时间
该题也是leecode第307场周赛的第三题,因为最近总是频繁的做到将二叉树转成图,然后进行BFS或者DFS的题,觉得有必要整理一下,今天就将该类题型总结并且整理一下。
首先介绍该题题目
链接在这
首先这道题其实看到思路是非常简单的,尤其是经常做leecode的人,其实应该能够很快想到建图+BFS,leecode中有一题求二叉树中到指定节点距离为k的节点值的一题,下面我会贴出来,这两个题其实是一模一样的,都是会给定一个节点或者一个节点值,让你找出从该节点出发符合某些条件的节点,那么对于这种题,如果你从这个角度,想要从这个节点开始搜索,其实是非常难做的,因为这是二叉树,和链表差不多,只能往下,无法回头,只有图这种特殊的数据结构是可以回搜的,或者对二叉树进行特殊处理,但是既然这样,那么不如直接将二叉树转成图,所以这题就是从建成图之后,从该节点开始进行BFS即可,值得注意的是可以在建图的过程中,将目标节点找到,可以省一些时间,下面开始分析该题代码。
/**
* 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 {
//首先建图的话,我们可以将父亲节点,让入map即可
Map<TreeNode,TreeNode> parents=new HashMap();
//这里需要使用一个set来存放节点,来确保这个节点是否有没有被使用过
Set<TreeNode> used=new HashSet();
//在遍历过程中保存目标节点
TreeNode targetNode;
public int amountOfTime(TreeNode root, int start) {
if(root.left==null&&root.right==null){
return 0;
}
findParent(root,null,start);
Deque<TreeNode> deque=new LinkedList();
deque.offer(targetNode);
int res=0;
while(!deque.isEmpty()){
int size=deque.size();
res++;
while(size>0){
TreeNode temp=deque.poll();
used.add(temp);
if(temp.left!=null&&!used.contains(temp.left)){
deque.offer(temp.left);
}
if(temp.right!=null&&!used.contains(temp.right)){
deque.offer(temp.right);
}
if(parents.get(temp)!=null&&!used.contains(parents.get(temp))){
deque.offer(parents.get(temp));
parents.remove(temp);
}
size--;
}
}
return --res;
}
public void findParent(TreeNode root,TreeNode parent,int start){
if(root==null){
return ;
}
if(root.val==start){
targetNode=root;
}
parents.put(root,parent);
findParent(root.left,root,start);
findParent(root.right,root,start);
}
}