0
点赞
收藏
分享

微信扫一扫

leetcode【中等】863、二叉树中所有距离为 K 的结点

静鸡鸡的JC 2022-02-22 阅读 52

给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 k 。返回到目标结点 target 距离为 k 的所有结点的值的列表。
在这里插入图片描述
思路:用hashmap记录每个节点的父节点,即可把 “树” 转化为 “图” ,从target出发可以dfs到每个节点,不区分向上搜父节点还是向下搜子节点。

为避免在深度优先搜索时重复访问结点,递归时额外传入来源结点 from,比如如果当前结点是由左子树通过map上来的,那当前结点的左边就没必要走了

在这里插入图片描述

class Solution {
    List<Integer>res=new ArrayList<>();
    Map<Integer, TreeNode> parents = new HashMap<Integer, TreeNode>();
    public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
        // 从 root 出发 DFS,记录每个结点的父结点
        findParents(root);
        // 从 target 出发 DFS,寻找所有深度为 k 的结点
        findAns(target, null, 0, k);
        return res;
    }
    //记录每个结点的父结点
    public void findParents(TreeNode root){
        if(root.left!=null){
            parents.put(root.left.val,root);
            findParents(root.left);
        }
        if(root.right!=null){
            parents.put(root.right.val,root);
            findParents(root.right);
        }
    }
    //以 target 为“root”,DFS,寻找depth为k的节点
    public void findAns(TreeNode root, TreeNode form,int depth,int k){
        if(root==null) return;
        if(depth==k){
            res.add(root.val);
            return;
        }
        if(root.left!=form) findAns(root.left,root,depth+1,k);
        if(root.right!=form) findAns(root.right,root,depth+1,k);
        if(parents.get(root.val)!=form) findAns(parents.get(root.val),root,depth+1,k);
    }
}
举报

相关推荐

0 条评论