LeetCode 863. 二叉树中所有距离为 K 的结点

题目链接

863. 二叉树中所有距离为 K 的结点

题目思想

一开始把这个题当做树的类型来做,结果是毫无思路。只好将树转成图,然后再从target出发,dfs寻找距离等于k的点。
因为树中的数值不是固定的,我们使用HashMap来存放邻接链表(为了省空间)。
利用一个方法,通过前序遍历的思路建立图,注意我们这个图应该是一个无向图。
在建立完邻接链表后,我们需要做的就是从target出发,去深搜距离等于k的点即可。

代码实现

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    HashMap<Integer, List<Integer>> map = new HashMap<>();
    List<Integer> res = new ArrayList<>();
    HashSet<Integer> set = new HashSet<>();
    public List<Integer> distanceK(TreeNode root, TreeNode target, int K) {
        buildGraph(root);
        find(target.val, K);
        return res;
    }

    public void buildGraph(TreeNode root){
        if(root == null){
            return;
        }
        if(!map.containsKey(root.val)){
            map.put(root.val, new ArrayList<>());
        }
        if(root.left != null){
            map.get(root.val).add(root.left.val);
            map.put(root.left.val, new ArrayList<>());
            map.get(root.left.val).add(root.val);
        }
        if(root.right != null){
            map.get(root.val).add(root.right.val);
            map.put(root.right.val, new ArrayList<>());
            map.get(root.right.val).add(root.val);
        }
        buildGraph(root.left);
        buildGraph(root.right);
    }

    public void find(Integer start, int k){
        if(set.contains(start)){
            return;
        }
        if(k == 0){
            res.add(start);
            return;
        }
        List<Integer> list = map.get(start);
        set.add(start);
        for(int i = 0; i < list.size(); i++){
            find(list.get(i), k - 1);
        }
    }
}

总结

有时候做题不要那么死板。。
通过截图

posted @ 2020-10-15 22:36  ZJPang  阅读(133)  评论(0编辑  收藏  举报