一、二叉树中第二小的节点
给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 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)
题解:
var findSecondMinimumValue = function(root) {
var rel=-1;
var min=root.val
var data=(value)=>{
if(!value) return
if(value.val>rel&&rel!==-1)return
if(value.val>min) {rel=value.val}
data(value.left)
data(value.right)
}
data(root)
return rel
};
二、有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
题解:
var isValid = function(s) {
if (s.length % 2 == 1) return false
const pairs = new Map([
[')', '('],
[']', '['],
['}', '{']
]);
var list = []
for (let cha of s) {
if (pairs.get(cha)) {
if (!list.length || list[list.length - 1] !== pairs.get(cha)) return false
list.pop()
} else {
list.push(cha)
}
}
return !list.length
}
三、整数反转
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
题解:
var reverse = function(x) {
var src = '' + x
var nameArr = src.split('');
var resultStr = '';
var index = 0
if (src.substr(0, 1) == '-') {
index += 1
resultStr += src.substr(0, 1)
}
for (var i = nameArr.length - 1; i >= index; i--) {
resultStr += src.charAt(i);
}
resultStr = parseInt(resultStr)
var two = Math.pow(2, 31)
if (resultStr > two - 1 || resultStr < -two) {
return 0
}
return resultStr
};