二叉树中所有距离为 K 的结点
1、题目
给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K 。
返回到目标结点 target 距离为 K 的所有结点的值的列表。 答案可以以任何顺序返回。
示例 1:
输入:root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, K = 2 输出:[7,4,1] 解释: 所求结点为与目标结点(值为 5)距离为 2 的结点, 值分别为 7,4,以及 1
注意,输入的 “root” 和 “target” 实际上是树上的结点。 上面的输入仅仅是对这些对象进行了序列化描述。
提示:
给定的树是非空的。 树上的每个结点都具有唯一的值 0 <= node.val <= 500 。 目标结点 target 是树上的结点。 0 <= K <= 1000.
2、题解
- 先遍历一遍二叉树,将每个节点的父节点存入hashmap中
Map<TreeNode,TreeNode>mp=new HashMap<>();
void dfs(TreeNode node){
if(node.left!=null){
mp.put(node.left,node);
dfs(node.left);
}if(node.right!=null){
mp.put(node.right,node);
dfs(node.right);
}
}
-
再以目标节点target开始,向左向右,向上(向父节点)搜索,直到所求节点与target节点距离为k,值得注意的是,由于每个结点值都是唯一的,为避免在深度优先搜索时重复访问结点,递归时额外传入来源结点 from,在递归前比较目标结点是否与来源结点相同。 void dfsVal(TreeNode node,TreeNode parent,int step,int k){
if(step==k){
list.add(node.val);
return;
}
if(node.right!=null&&node.right!=parent){
dfsVal(node.right,node,step+1,k);
}
if(node.left!=null&&node.left!=parent){
dfsVal(node.left,node,step+1,k);
}
if(mp.get(node)!=null&&mp.get(node)!=parent){
dfsVal(mp.get(node),node,step+1,k);
}
}
综上所诉 class Solution {
Map<TreeNode,TreeNode>mp=new HashMap<>();
List<Integer>list=new ArrayList<>();
public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
dfs(root);
dfsVal(target,null,0,k);
return list;
}
void dfs(TreeNode node){
if(node.left!=null){
mp.put(node.left,node);
dfs(node.left);
}if(node.right!=null){
mp.put(node.right,node);
dfs(node.right);
}
}
void dfsVal(TreeNode node,TreeNode parent,int step,int k){
if(step==k){
list.add(node.val);
return;
}
if(node.right!=null&&node.right!=parent){
dfsVal(node.right,node,step+1,k);
}
if(node.left!=null&&node.left!=parent){
dfsVal(node.left,node,step+1,k);
}
if(mp.get(node)!=null&&mp.get(node)!=parent){
dfsVal(mp.get(node),node,step+1,k);
}
}
}
|