二叉树中所有距离为 K 的结点
- leetcode863. 二叉树中所有距离为 K 的结点
- 题目描述
- DFS 深度优先遍历
- 代码演示
- 二叉树专题
leetcode863. 二叉树中所有距离为 K 的结点
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/all-nodes-distance-k-in-binary-tree
题目描述
给定一个二叉树(具有根结点 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
示例 2:
输入: root = [1], target = 1, k = 3
输出: []
提示:
节点数在 [1, 500] 范围内
0 <= Node.val <= 500
Node.val 中所有值 不同
目标结点 target 是树上的结点。
0 <= k <= 1000
DFS 深度优先遍历
二叉树或者多叉树中关于距离深度的问题,用深度优先遍历是比较好的选择,
但这个问题中,
简单的深度优先遍历,无法找到向上的节点,因此我们需要把节点的父节点信息都保存在一个结构中,方便去遍历.因为节点值都是唯一的,我们可以用 Map<Integer, TreeNode> parents 去保存.
然后深度遍历时 也去遍历父节点
代码演示
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
Map<Integer, TreeNode> parents = new HashMap<Integer, TreeNode>();
List<Integer> ans = new ArrayList<Integer>();
public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
// 从 root 出发 DFS,记录每个结点的父结点
findParents(root);
// 从 target 出发 DFS,寻找所有深度为 k 的结点
findDistanceK(target, null, 0, k);
return ans;
}
/**
* 把节点和节点对应的父节点保存在一个表中 方便查询
*/
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);
}
}
/**
* DFS深度优先遍历
* form 用来标记出发节点 减少重复计算
*/
public void findDistanceK(TreeNode target,TreeNode from,int depth,int k){
//base case
if(target == null ){
return ;
}
// 距离相等时 加入到答案里
if(depth == k){
ans.add(target.val);
return;
}
//遍历左树
if(target.left != from){
findDistanceK(target.left,target,depth + 1,k);
}
//遍历右树
if(target.right != from){
findDistanceK(target.right,target,depth + 1,k);
}
//遍历父节点
if(parents.get(target.val) != from){
findDistanceK(parents.get(target.val),target,depth + 1,k);
}
}
}
二叉树专题
leetcode257. 二叉树的所有路径
leetcode814. 二叉树剪枝
leetcode111. 二叉树的最小深度
leetcode199. 二叉树的右视图
leetcode222. 完全二叉树的节点个数
leetcode2385. 感染二叉树需要的总时间