Java版本的建图+BFS做题思路整理

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);
     }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhouyang0416

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值