• [LeetCode] 863. All Nodes Distance K in Binary Tree


    We are given a binary tree (with root node root), a target node, and an integer value k.

    Return a list of the values of all nodes that have a distance k from the target node.  The answer can be returned in any order.

    Example 1:

    Input: root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, k = 2
    
    Output: [7,4,1]
    
    Explanation: 
    The nodes that are a distance 2 from the target node (with value 5)
    have values 7, 4, and 1.
    
    
    
    Note that the inputs "root" and "target" are actually TreeNodes.
    The descriptions of the inputs above are just serializations of these objects.

    Note:

    1. The given tree is non-empty.
    2. Each node in the tree has unique values 0 <= node.val <= 500.
    3. The target node is a node in the tree.
    4. 0 <= k <= 1000.

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

    给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K 。

    返回到目标结点 target 距离为 K 的所有结点的值的列表。 答案可以以任何顺序返回。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/all-nodes-distance-k-in-binary-tree
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    这道题非常好,是一道树 tree 和图论 graph 的结合题。这里我提供一个 BFS 的做法。

    题目给的 input 是树,但是我们是需要把他转译成图才能做的,这样我们才能既可以知道父节点的邻居有子节点,也可以知道子节点的邻居有父节点。知道这些信息之后,我们从 target 节点开始做 BFS 遍历。因为题目找的是距离 target 节点长度为 K 的节点,所以我们在开始 BFS 遍历的同时,要记得 K--。这样当 K = 0 的时候,如果此时 queue 中有元素,这些元素就都是相距 target 节点,距离为 K 的节点。

    时间O(n)

    空间O(n)

    Java实现

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     int val;
     5  *     TreeNode left;
     6  *     TreeNode right;
     7  *     TreeNode(int x) { val = x; }
     8  * }
     9  */
    10 class Solution {
    11     HashMap<TreeNode, List<TreeNode>> map = new HashMap<>();
    12     
    13     public List<Integer> distanceK(TreeNode root, TreeNode target, int K) {
    14         List<Integer> res = new ArrayList<>();
    15         
    16         // build the graph
    17         buildGraph(root, null);
    18         
    19         // corner case
    20         if (!map.containsKey(target)) {
    21             return res;
    22         }
    23         
    24         HashSet<TreeNode> visited = new HashSet<>();
    25         Queue<TreeNode> queue = new LinkedList<>();
    26         visited.add(target);
    27         queue.offer(target);
    28         while (!queue.isEmpty()) {
    29             int size = queue.size();
    30             // 抵达终点
    31             if (K == 0) {
    32                 for (int i = 0; i < size; i++) {
    33                     TreeNode cur = queue.poll();
    34                     res.add(cur.val);
    35                 }
    36                 return res;
    37             }
    38             
    39             // 在路上
    40             for (int i = 0; i < size; i++) {
    41                 TreeNode cur = queue.poll();
    42                 for (TreeNode next : map.get(cur)) {
    43                     if (visited.contains(next)) {
    44                         continue;
    45                     }
    46                     visited.add(next);
    47                     queue.offer(next);
    48                 }
    49             }
    50             K--;
    51         }
    52         return res;
    53     }
    54     
    55     // 类似前序遍历的方式创建图
    56     private void buildGraph(TreeNode node, TreeNode parent) {
    57         // base case
    58         if (node == null) {
    59             return;
    60         }
    61         if (!map.containsKey(node)) {
    62             map.put(node, new ArrayList<>());
    63             if (parent != null) {
    64                 map.get(node).add(parent);
    65                 map.get(parent).add(node);
    66             }
    67             buildGraph(node.left, node);
    68             buildGraph(node.right, node);
    69         }
    70     }
    71 }

    LeetCode 题目总结

  • 相关阅读:
    基于Woodstox的StAX 2 (Streaming API for XML)解析XML
    JAVA技术路线图
    richface的配置、用法介绍和注意事项
    POS与EPOS区别
    CSDN:你认为一名优秀的技术人应该具备怎样的素质?
    阶段一-03.地址,订单,支付,定时任务开发-第1章 收货地址功能开发-1-5 收货地址
    阶段一-03.地址,订单,支付,定时任务开发-第1章 收货地址功能开发-1-4 收货地址
    阶段一-03.地址,订单,支付,定时任务开发-第1章 收货地址功能开发-1-3 收货地址
    阶段一-03.地址,订单,支付,定时任务开发-第1章 收货地址功能开发-1-2 收货地址
    阶段一-03.地址,订单,支付,定时任务开发-第1章 收货地址功能开发-1-1 收货地址
  • 原文地址:https://www.cnblogs.com/cnoodle/p/14783291.html
Copyright © 2020-2023  润新知