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 的结点的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 863. 二叉树中所有距离为 K 的结点/ 641. 设计循环双端队列 / 622. 设计循环队列