给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K 。
返回到目标结点 target 距离为 K 的所有结点的值的列表。 答案可以以任何顺序返回。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/all-nodes-distance-k-in-binary-tree

提示:
给定的树是非空的。
树上的每个结点都具有唯一的值 0 <= node.val <= 500 。
目标结点 target 是树上的结点。
0 <= K <= 1000.
解题思路:
1、判断当前根节点是否是target这个节点,如果是,直接调用方法,查找左右子树中距离这个节点为k的子节点。如果不是,那么就执行步骤2.
2、在当前节点中查找target的父节点parent,如果parent为null,说明这棵树中没有target这个节点,否则如果可以找到target的父节点的时候,那么判断target是parent的哪一个子节点,然后调用方法查找距离为k的子节点,这时候找到的是target的子节点,但是实际结果还可能包括target的父节点甚至是父节点的其他子节点。所以这时候进入递归,重新调用方法distanceK(root,parent,k - 1),查找距离parent为k - 1的节点。但是递归查找距离parent为k - 1的时候需要注意一点,访问的子节点不可以是已经访问过的,需要标记哪些顶点已经访问过了,所以在将target的子节点添加到列表之后,都需要将target变成null,表示已经访问过了。
如果仍旧不清楚,请看下面的演示过程:

对应的代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
List<Integer> list = new ArrayList<Integer>();
public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
if(root == target){
//如果根节点就是target这个节点,那么从它的左右子树中查找距离为K的节点
//这时候不在需要执行递归了,这也是为什么没有写递归结束的条件,程序依旧不会发生报错的原因
findDistancdK(root,k);

最低0.47元/天 解锁文章
1157

被折叠的 条评论
为什么被折叠?



