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

Posted qq_40707462

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode中等863二叉树中所有距离为 K 的结点相关的知识,希望对你有一定的参考价值。

给定一个二叉树(具有根结点 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);
    

以上是关于leetcode中等863二叉树中所有距离为 K 的结点的主要内容,如果未能解决你的问题,请参考以下文章

DFS863. 二叉树中所有距离为 K 的结点(中等)

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

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

LeetCode 863. 二叉树中所有距离为 K 的结点/ 641. 设计循环双端队列 / 622. 设计循环队列

LeetCode 863 二叉树中所有距离为K的节点[Map 二叉树 DFS] HERODING的LeetCode之路

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