[leetcode javascript]104. 二叉树的最大深度 和 993. 二叉树的堂兄弟节点 和 1185. 一周中的第几天

104. 二叉树的最大深度

思路(我觉得这个思路可以参考) 来源题解
标签: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;

993. 二叉树的堂兄弟节点

官方题解 用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);
        }
    }
};

1185. 一周中的第几天

感觉逻辑没错但答案还是不对

/**
 * @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];
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值