二叉树 
      
    
      
      
      
        哈希表 
      
    
      
      
      
        广度优先搜索 
      
    
      
      
      
        树 
      
    
      
      
      
        深度优先搜索 
      
    
   
  
    
      
       
     
  
  
    
      
    
    
      
       
     
  
题目描述 
给定一个二叉树(具有根结点 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 + 哈希表 
我们先用 DFS 遍历整棵树,将每个节点的父节点保存到哈希表 \(\textit{g}\)  中。
接下来,我们再次用 DFS,从 \(\textit{target}\)  出发,向上向下搜索距离为 \(k\)  的节点,添加到结果数组中。
时间复杂度 \(O(n)\) ,空间复杂度 \(O(n)\) 。其中 \(n\)  为二叉树的节点个数。
Python3 Java C++ Go TypeScript 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 # Definition for a binary tree node. 
# class TreeNode: 
#     def __init__(self, x): 
#         self.val = x 
#         self.left = None 
#         self.right = None 
class   Solution : 
    def   distanceK ( self ,  root :  TreeNode ,  target :  TreeNode ,  k :  int )  ->  List [ int ]: 
        def   dfs ( root ,  fa ): 
            if  root  is  None : 
                return 
            g [ root ]  =  fa 
            dfs ( root . left ,  root ) 
            dfs ( root . right ,  root ) 
        def   dfs2 ( root ,  fa ,  k ): 
            if  root  is  None : 
                return 
            if  k  ==  0 : 
                ans . append ( root . val ) 
                return 
            for  nxt  in  ( root . left ,  root . right ,  g [ root ]): 
                if  nxt  !=  fa : 
                    dfs2 ( nxt ,  root ,  k  -  1 ) 
        g  =  {} 
        dfs ( root ,  None ) 
        ans  =  [] 
        dfs2 ( target ,  None ,  k ) 
        return  ans 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 /** 
 * Definition for a binary tree node. 
 * public class TreeNode { 
 *     int val; 
 *     TreeNode left; 
 *     TreeNode right; 
 *     TreeNode(int x) { val = x; } 
 * } 
 */ 
class  Solution   { 
     private   Map < TreeNode ,   TreeNode >   g   =   new   HashMap <> (); 
     private   List < Integer >   ans   =   new   ArrayList <> (); 
     public   List < Integer >   distanceK ( TreeNode   root ,   TreeNode   target ,   int   k )   { 
         dfs ( root ,   null ); 
         dfs2 ( target ,   null ,   k ); 
         return   ans ; 
     } 
     private   void   dfs ( TreeNode   root ,   TreeNode   fa )   { 
         if   ( root   ==   null )   { 
             return ; 
         } 
         g . put ( root ,   fa ); 
         dfs ( root . left ,   root ); 
         dfs ( root . right ,   root ); 
     } 
     private   void   dfs2 ( TreeNode   root ,   TreeNode   fa ,   int   k )   { 
         if   ( root   ==   null )   { 
             return ; 
         } 
         if   ( k   ==   0 )   { 
             ans . add ( root . val ); 
             return ; 
         } 
         for   ( TreeNode   nxt   :   new   TreeNode []   { root . left ,   root . right ,   g . get ( root )})   { 
             if   ( nxt   !=   fa )   { 
                 dfs2 ( nxt ,   root ,   k   -   1 ); 
             } 
         } 
     } 
} 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 /** 
 * Definition for a binary tree node. 
 * struct TreeNode { 
 *     int val; 
 *     TreeNode *left; 
 *     TreeNode *right; 
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} 
 * }; 
 */ 
class   Solution   { 
public : 
     vector < int >   distanceK ( TreeNode *   root ,   TreeNode *   target ,   int   k )   { 
         unordered_map < TreeNode * ,   TreeNode *>   g ; 
         vector < int >   ans ; 
         auto   dfs   =   [ & ]( this   auto &&   dfs ,   TreeNode *   node ,   TreeNode *   fa )   { 
             if   ( ! node )   return ; 
             g [ node ]   =   fa ; 
             dfs ( node -> left ,   node ); 
             dfs ( node -> right ,   node ); 
         }; 
         auto   dfs2   =   [ & ]( this   auto &&   dfs2 ,   TreeNode *   node ,   TreeNode *   fa ,   int   k )   { 
             if   ( ! node )   return ; 
             if   ( k   ==   0 )   { 
                 ans . push_back ( node -> val ); 
                 return ; 
             } 
             for   ( auto &&   nxt   :   { node -> left ,   node -> right ,   g [ node ]})   { 
                 if   ( nxt   !=   fa )   { 
                     dfs2 ( nxt ,   node ,   k   -   1 ); 
                 } 
             } 
         }; 
         dfs ( root ,   nullptr ); 
         dfs2 ( target ,   nullptr ,   k ); 
         return   ans ; 
     } 
}; 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 func   distanceK ( root   * TreeNode ,   target   * TreeNode ,   k   int )   [] int   { 
     g   :=   make ( map [ * TreeNode ] * TreeNode ) 
     ans   :=   [] int {} 
     var   dfs   func ( node ,   fa   * TreeNode ) 
     dfs   =   func ( node ,   fa   * TreeNode )   { 
         if   node   ==   nil   { 
             return 
         } 
         g [ node ]   =   fa 
         dfs ( node . Left ,   node ) 
         dfs ( node . Right ,   node ) 
     } 
     var   dfs2   func ( node ,   fa   * TreeNode ,   k   int ) 
     dfs2   =   func ( node ,   fa   * TreeNode ,   k   int )   { 
         if   node   ==   nil   { 
             return 
         } 
         if   k   ==   0   { 
             ans   =   append ( ans ,   node . Val ) 
             return 
         } 
         for   _ ,   nxt   :=   range   [] * TreeNode { node . Left ,   node . Right ,   g [ node ]}   { 
             if   nxt   !=   fa   { 
                 dfs2 ( nxt ,   node ,   k - 1 ) 
             } 
         } 
     } 
     dfs ( root ,   nil ) 
     dfs2 ( target ,   nil ,   k ) 
     return   ans 
} 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 /** 
 * Definition for a binary tree node. 
 * class TreeNode { 
 *     val: number 
 *     left: TreeNode | null 
 *     right: TreeNode | null 
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) { 
 *         this.val = (val===undefined ? 0 : val) 
 *         this.left = (left===undefined ? null : left) 
 *         this.right = (right===undefined ? null : right) 
 *     } 
 * } 
 */ 
function   distanceK ( root :   TreeNode   |   null ,   target :   TreeNode   |   null ,   k :   number ) :   number []   { 
     const   g   =   new   Map < TreeNode ,   TreeNode   |   null > (); 
     const   ans :   number []   =   []; 
     const   dfs   =   ( node :   TreeNode   |   null ,   fa :   TreeNode   |   null )   =>   { 
         if   ( ! node )   { 
             return ; 
         } 
         g . set ( node ,   fa ); 
         dfs ( node . left ,   node ); 
         dfs ( node . right ,   node ); 
     }; 
     const   dfs2   =   ( node :   TreeNode   |   null ,   fa :   TreeNode   |   null ,   k :   number )   =>   { 
         if   ( ! node )   { 
             return ; 
         } 
         if   ( k   ===   0 )   { 
             ans . push ( node . val ); 
             return ; 
         } 
         for   ( const   nxt   of   [ node . left ,   node . right ,   g . get ( node )   ||   null ])   { 
             if   ( nxt   !==   fa )   { 
                 dfs2 ( nxt ,   node ,   k   -   1 ); 
             } 
         } 
     }; 
     dfs ( root ,   null ); 
     dfs2 ( target ,   null ,   k ); 
     return   ans ; 
} 
 
 
 
 
  
  
  
    
    
    
    
      
  
    
      
  
     
   
  GitHub