图论16(Leetcode863.二叉树中所有距离为K的结点)

答案:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
        Map<Integer, int[]> map = new HashMap<>();
        int[] link = {-1,-1,-1};
        map.put(root.val,link);
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while(queue.size()!=0){
            TreeNode cur = queue.poll();
            int[] link1 = new int[3];
            int[]temp = map.get(cur.val);//cur包含父节点的link
            link1[0] = temp[0];
            link1[1] = -1;
            link1[2] = -1;
            int[] link2 = {cur.val,-1,-1};//记录left right的父节点
            if(cur.left!=null){
                TreeNode left = cur.left;
                link1[1] = left.val;
                map.put(left.val,link2);
                queue.add(left);

            }
            if(cur.right!=null){
                TreeNode right = cur.right;
                link1[2] = right.val;
                map.put(right.val,link2);
                queue.add(right);
            }
            map.put(cur.val,link1);
        }

        map.forEach((key, value) -> System.out.println("Key = " + key + ", Value = " + value[0] +" "+ value[1]+" "+ value[2]));


        List<Integer> res = new ArrayList<>();
        Queue<Integer> queue2 = new LinkedList<>();
        Set<Integer> set = new HashSet<>();
        queue2.add(target.val);
        set.add(target.val);
        int step = 0;
        while(queue2.size()!=0){
            if(step==k){
                while(queue2.size()!=0){
                    res.add(queue2.poll());
                }
                break;
            }
            int len = queue2.size();
            for(int i=0;i<len;i++){
                int node = queue2.poll();
                int value[] = map.get(node);
                if(value[0]!=-1&&!set.contains(value[0])){
                    queue2.add(value[0]);
                    set.add(value[0]);
                }
                if(value[1]!=-1&&!set.contains(value[1])){
                    queue2.add(value[1]);
                    set.add(value[1]);
                }
                if(value[2]!=-1&&!set.contains(value[2])){
                    queue2.add(value[2]);
                    set.add(value[2]);
                }

            }
            step++;
        }
        return res;
    }
}
相关推荐
想逃离铁厂的老铁4 小时前
Day50 >> 98、可达路径 + 广度优先搜索理论基础
算法·深度优先·图论
blazeDP5 小时前
洛谷P7224 [RC-04] 子集积解析
算法·深度优先·图论
闻缺陷则喜何志丹1 天前
【图论】P9661 [ICPC 2021 Macao R] Sandpile on Clique|普及+
c++·算法·图论·洛谷
拼好饭和她皆失1 天前
《图论算法入门:掌握DFS和BFS,理解图与树的遍历》
深度优先·图论·宽度优先
罗湖老棍子2 天前
强迫症冒险家的任务清单:字典序最小拓扑排序
数据结构·算法·图论·拓扑排序
燃于AC之乐3 天前
我的算法修炼之路--8——预处理、滑窗优化、前缀和哈希同余,线性dp,图+并查集与逆向图
算法·哈希算法·图论·滑动窗口·哈希表·线性dp
2401_827499993 天前
代码随想录-图论28
算法·深度优先·图论
ValhallaCoder3 天前
Day51-图论
数据结构·python·算法·图论
ValhallaCoder4 天前
Day53-图论
数据结构·python·算法·图论
(❁´◡`❁)Jimmy(❁´◡`❁)5 天前
Atcoder abc441A~F 题解
算法·深度优先·图论