图论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;
    }
}
相关推荐
Coder-magician2 天前
《代码随想录》刷题打卡day44:图论-part02
算法·深度优先·图论
h_a_o777oah10 天前
【图论】网络流:Dinic 算法模板实现原理及解题技巧
c++·算法·图论·acm·网络流·最小割·dinic算法
有点。11 天前
C++03阶段练习(练习题)
数据结构·算法·图论
-dzk-16 天前
【图论】LC 207.课程表
图论
wuyk55517 天前
18.Kruskal 算法:用最短的边连成一张网
开发语言·算法·图论
-dzk-17 天前
【图论】LC 994.腐烂的橘子
图论
-dzk-18 天前
【图论】LC 200.岛屿数量
深度优先·图论
Lyyaoo.19 天前
【图论】岛屿数量/腐烂的橘子/课程表/实现前缀树
图论
lvwangshu21 天前
图论:LCA、树的直径、树的重心、二分图与 Tarjan 缩点
算法·图论
hansang_IR22 天前
【题解】[APIO2023] 赛博乐园 / cyberland
c++·算法·图论