二叉树
哈希表
广度优先搜索
树
深度优先搜索
题目描述
给定一个二叉树(具有根结点 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