思路(我觉得这个思路可以参考) 来源题解
标签:DFS
找出终止条件: 当前节点为空
找出返回值: 节点为空时说明高度为0,所以返回0;节点不为空时则分别求左右子树的高度的最大值,同时加1表示当前节点的高度,返回该数值
某层的执行过程:在返回值部分基本已经描述清楚
时间复杂度:O(n)
// 表达方式一:用let:80ms 用const:96ms
// var maxDepth = function(root) {
// if(!root)return 0;
// else{
// const left = maxDepth(root.left);//原答案是用const,但不知道是不是一定要用const
// const right = maxDepth(root.right);
// return Math.max(left, right) + 1;
// }
// };
// 表达方式二:88ms
var maxDepth = root => root? Math.max(maxDepth(root.left), maxDepth(root.right)) + 1 : 0;
官方题解 用dfs(递归)
在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。
如果二叉树的两个节点深度相同,但父节点不同,则它们是一对堂兄弟节点。
我们给出了具有唯一值的二叉树的根节点 root,以及树中两个不同节点的值 x 和 y。
只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true。否则,返回 false。
执行用时 :80 ms, 在所有 JavaScript 提交中击败了75.86%的用户
内存消耗 :35 MB, 在所有 JavaScript 提交中击败了30.00%的用户
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @param {number} x
* @param {number} y
* @return {boolean}
*/
var isCousins = function(root, x, y) {
let depth = new Map();
let parent = new Map();
dfs(root,null);
return (depth.get(x) == depth.get(y) && parent.get(x) != parent.get(y));
function dfs(node, par){
if(node){
depth.set(node.val, par != null ? 1 + depth.get(par.val) : 0);
parent.set(node.val, par);
dfs(node.left, node);
dfs(node.right, node);
}
}
};
感觉逻辑没错但答案还是不对
/**
* @param {number} day
* @param {number} month
* @param {number} year
* @return {string}
*/
var dayOfTheWeek = function(day, month, year) {
let isLeapYear = year => {
if(!year%400 || (!year%4 && year%100))return true;
else return false;
// if(year % 400 == 0)return true;
// else if(year % 100 != 0 && year % 4 == 0)return true;
// else return false;
};
let dayOfyear = (year => {
if(isLeapYear(year))return 366;
else return 365;
});
let hashDays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
let hashMonths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
let start = 4;//为什么是4?
let sum = 0;
// 年
for(let i = 1971; i < year; i++){
sum += dayOfyear(year);
}
// 月
for(let i = 1; i < month; i++){//注意现实月份与数组的关系。一个从1开始,一个从0开始
if(i-1 == 1 && isLeapYear(year)){
sum += 29;
}else{
sum += hashMonths[i-1];
}
}
// 日
sum += day;
sum = sum % 7;
let now = (sum + start) % 7;
return hashDays[now];
};