树
深度优先搜索
广度优先搜索
二叉树
题目描述
给你一棵二叉树,请你返回满足以下条件的所有节点的值之和:
该节点的祖父节点的值为偶数。(一个节点的祖父节点是指该节点的父节点的父节点。)
如果不存在祖父节点值为偶数的节点,那么返回 0
。
示例:
输入: root = [6,7,8,2,7,1,3,9,null,1,4,null,null,null,5]
输出: 18
解释: 图中红色节点的祖父节点的值为偶数,蓝色节点为这些红色节点的祖父节点。
提示:
树中节点的数目在 1
到 10^4
之间。
每个节点的值在 1
到 100
之间。
解法
方法一:DFS
我们设计一个函数 $dfs(root, x)$,表示以 $root$ 为根节点,并且 $root$ 的父节点的值为 $x$ 的子树中,满足条件的节点的值之和。那么答案就是 $dfs(root, 1)$。
函数 $dfs(root, x)$ 的执行过程如下:
如果 $root$ 为空,返回 $0$。
否则,我们递归计算 $root$ 的左子树和右子树的答案,即 $dfs(root.left, root.val)$ 和 $dfs(root.right, root.val)$,累加到答案中。如果 $x$ 为偶数,此时我们判断 $root$ 的左孩子和右孩子是否存在,如果存在,我们将它们的值累加到答案中。
最后返回答案。
时间复杂度 $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 # Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution :
def sumEvenGrandparent ( self , root : TreeNode ) -> int :
def dfs ( root : TreeNode , x : int ) -> int :
if root is None :
return 0
ans = dfs ( root . left , root . val ) + dfs ( root . right , root . val )
if x % 2 == 0 :
if root . left :
ans += root . left . val
if root . right :
ans += root . right . val
return ans
return dfs ( root , 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 /**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int sumEvenGrandparent ( TreeNode root ) {
return dfs ( root , 1 );
}
private int dfs ( TreeNode root , int x ) {
if ( root == null ) {
return 0 ;
}
int ans = dfs ( root . left , root . val ) + dfs ( root . right , root . val );
if ( x % 2 == 0 ) {
if ( root . left != null ) {
ans += root . left . val ;
}
if ( root . right != null ) {
ans += root . right . val ;
}
}
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 /**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public :
int sumEvenGrandparent ( TreeNode * root ) {
function < int ( TreeNode * , int ) > dfs = [ & ]( TreeNode * root , int x ) {
if ( ! root ) {
return 0 ;
}
int ans = dfs ( root -> left , root -> val ) + dfs ( root -> right , root -> val );
if ( x % 2 == 0 ) {
if ( root -> left ) {
ans += root -> left -> val ;
}
if ( root -> right ) {
ans += root -> right -> val ;
}
}
return ans ;
};
return dfs ( root , 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 /**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func sumEvenGrandparent ( root * TreeNode ) int {
var dfs func ( * TreeNode , int ) int
dfs = func ( root * TreeNode , x int ) int {
if root == nil {
return 0
}
ans := dfs ( root . Left , root . Val ) + dfs ( root . Right , root . Val )
if x % 2 == 0 {
if root . Left != nil {
ans += root . Left . Val
}
if root . Right != nil {
ans += root . Right . Val
}
}
return ans
}
return dfs ( root , 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 /**
* 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 sumEvenGrandparent ( root : TreeNode | null ) : number {
const dfs = ( root : TreeNode | null , x : number ) : number => {
if ( ! root ) {
return 0 ;
}
const { val , left , right } = root ;
let ans = dfs ( left , val ) + dfs ( right , val );
if ( x % 2 === 0 ) {
ans += left ? . val ?? 0 ;
ans += right ? . val ?? 0 ;
}
return ans ;
};
return dfs ( root , 1 );
}
GitHub