树
深度优先搜索
二叉树
题目描述
给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2
或 0
。如果一个节点有两个子节点的话,那么该节点的值等于两个子节点中较小的一个。
更正式地说,即 root.val = min(root.left.val, root.right.val)
总成立。
给出这样的一个二叉树,你需要输出所有节点中的 第二小的值 。
如果第二小的值不存在的话,输出 -1 。
示例 1:
输入: root = [2,2,5,null,null,5,7]
输出: 5
解释: 最小的值是 2 ,第二小的值是 5 。
示例 2:
输入: root = [2,2,2]
输出: -1
解释: 最小的值是 2, 但是不存在第二小的值。
提示:
树中节点数目在范围 [1, 25]
内
1 <= Node.val <= 231 - 1
对于树中每个节点 root.val == min(root.left.val, root.right.val)
解法
方法一:DFS
直接 DFS 遍历二叉树,找到大于 root.val
的最小值。若不存在,则返回 -1。
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是二叉树的节点数。
Python3 Java C++ Go JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 # 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 findSecondMinimumValue ( self , root : Optional [ TreeNode ]) -> int :
def dfs ( root ):
if root :
dfs ( root . left )
dfs ( root . right )
nonlocal ans , v
if root . val > v :
ans = root . val if ans == - 1 else min ( ans , root . val )
ans , v = - 1 , root . val
dfs ( root )
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 /**
* 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 {
private int ans = - 1 ;
public int findSecondMinimumValue ( TreeNode root ) {
dfs ( root , root . val );
return ans ;
}
private void dfs ( TreeNode root , int val ) {
if ( root != null ) {
dfs ( root . left , val );
dfs ( root . right , val );
if ( root . val > val ) {
ans = ans == - 1 ? root . val : Math . min ( ans , root . val );
}
}
}
}
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.
* 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 ans = -1 ;
int findSecondMinimumValue ( TreeNode * root ) {
dfs ( root , root -> val );
return ans ;
}
void dfs ( TreeNode * root , int val ) {
if ( ! root ) return ;
dfs ( root -> left , val );
dfs ( root -> right , val );
if ( root -> val > val ) ans = ans == -1 ? root -> val : min ( ans , root -> val );
}
};
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 /**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func findSecondMinimumValue ( root * TreeNode ) int {
ans , v := - 1 , root . Val
var dfs func ( * TreeNode )
dfs = func ( root * TreeNode ) {
if root == nil {
return
}
dfs ( root . Left )
dfs ( root . Right )
if root . Val > v {
if ans == - 1 || ans > root . Val {
ans = root . Val
}
}
}
dfs ( root )
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 /**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
var findSecondMinimumValue = function ( root ) {
let ans = - 1 ;
const v = root . val ;
function dfs ( root ) {
if ( ! root ) {
return ;
}
dfs ( root . left );
dfs ( root . right );
if ( root . val > v ) {
if ( ans == - 1 || ans > root . val ) {
ans = root . val ;
}
}
}
dfs ( root );
return ans ;
};
GitHub