zoukankan      html  css  js  c++  java
  • leetcode cs-notes-树(一)【js】

    Maximum Depth of Binary Tree (Easy)

    【递归】

    var maxDepth = function(root) {
        if(root === null) return 0;
        const max = (a, b) => {
            return a > b ? a : b;
        }
        return max(maxDepth(root.left), maxDepth(root.right)) + 1;
    };
    

    【层序遍历】

    广度优先

    var maxDepth = function(root) {
        const queue = [];
        let ans = 0;
        if(!root) return ans;
        queue.push(root);
        while(queue.length > 0){
            let curSize = queue.length;
            while(curSize > 0){
                let curNode = queue.shift();
                if(curNode.left) queue.push(curNode.left);
                if(curNode.right) queue.push(curNode.right);
                curSize --;
            }
            ans ++;
        }
        return ans;
    };
    

    Balanced Binary Tree (Easy)

    【自顶向下】

    就是计算左右子树的高度,如果高度差大于1,就不是平衡树。

    var isBalanced = function(root) {
    	const maxDepth = (node) => {
            if(!node) return 0;
            let l = maxDepth(node.left);
            let r = maxDepth(node.right);
            return Math.max(l, r) + 1;
        }
        return !(maxDepth(root.left) - maxDepth(root.right)) > 1 && isBalanced(root.left) && isBalanced(root.right);
    }
    

    上面这个复杂度以看就很高,很多多余计算。maxDepth的复杂度是O(h),最坏情况需要遍历所有节点O(n),对于某一个节点,它需要调用自己的高度次数的maxDepth,所以复杂度是O(nlogn)。

    【自底向上】

    跟上面的比起来,这个不用对每一个节点都判断是否平衡,遇到不平衡时res = false,只对根节点执行maxDepth,复杂度下降到最差情况是O(n),就算每个节点都计算一次maxDepth

    var isBalanced = function(root) {
        let res = true;
    	const maxDepth = (node) => {
            if(!node) return 0;
            let l = maxDepth(node.left);
            let r = maxDepth(node.right);
            if(Math.abs(l - r) > 1) res = false;
            return Math.max(l, r) + 1;
        }
        maxDepth(root);
        return res;
    }
    

    一路递归到叶节点,再返回,一路上只要有非平衡树,直接一路返回false。

    var isBalanced = function(root) {
        const maxDepth = (node) => {
            if(!node) return 0;
            let l = 0;
            let r = 0;
            l = maxDepth(node.left);
            r = maxDepth(node.right);
            if(l === -1 || r === -1 || Math.abs(l-r) > 1)
                return -1;
            else
                return Math.max(l, r) + 1;
        }
        return maxDepth(root) >= 0;
    };
    

    Diameter of Binary Tree (Easy)

    如图我们可以知道路径 [9, 4, 2, 5, 7, 8] 可以被看作以 22 为起点,从其左儿子向下遍历的路径 [2, 4, 9] 和从其右儿子向下遍历的路径 [2, 5, 7, 8] 拼接得到。

    假设我们知道对于该节点的左儿子向下遍历经过最多的节点数 LL (即以左儿子为根的子树的深度) 和其右儿子向下遍历经过最多的节点数 RR (即以右儿子为根的子树的深度),那么以该节点为起点的路径经过节点数的最大值即为 L+R+1,路径长度即为 L+R。

    var diameterOfBinaryTree = function(root) {
        let ans = 0;
        const maxDepth = (node) => {
            if(!node) return 0;
            let l = maxDepth(node.left);
            let r = maxDepth(node.right);
            ans = (l+r) > ans ? l+r : ans;
            return Math.max(l, r) + 1;
        }
        maxDepth(root);
        return ans;
    };
    

    Invert Binary Tree (Easy)

    【递归】

    感觉思路就算从考虑node开始,只要把node处理好,它的左子树右子树也会被处理好。就需要达到这样的一个解决状态。

    复杂度O(n),因为每个节点都执行一次invertTreeNode

    var invertTree = function(root) {
        const invertTreeNode = (node) => {
            if(node === null) return null;
            let tmpNode = node.left;
            node.left = invertTreeNode(node.right);
            node.right = invertTreeNode(tmpNode);
            return node;
        }
        return invertTreeNode(root);
    };
    

    Merge Two Binary Trees (Easy)

    哎写起感觉是一种思路

    复杂度O(n),也是每个节点都执行一次mergeTreesNode

    var mergeTrees = function(t1, t2) {
        const mergeTreesNode = (node1, node2) => {
            if(node1 === null && node2 !== null)
                return node2;
            if(node1 !== null && node2 === null)
                return node1;
            if(!(node1 && node2)) return null;
            let node = new TreeNode();
            node.val = node1.val + node2.val;
            node.left = mergeTreesNode(node1.left, node2.left);
            node.right = mergeTreesNode(node1.right, node2.right);
            return node;
        }
        return mergeTreesNode(t1, t2);
    };
    
  • 相关阅读:
    关于升级至12cR2版本的Optimizer 自适应特性的设置建议
    sqlserver varchar转换为decimal语句
    大数据相关的面试题
    介绍哈希函数及解决冲突的方法
    Java爬虫爬取网站电影下载链接
    微软网络安全服务Azure Sentinel——安全事件管理平台(SIEM)
    Adversarial Logit Pairing——防御对抗样本的另外一种思路,将对抗样本加入训练数据集
    Defense-GAN——防御对抗样本,本质上就是在用类似编码解码器(论文用了GAN)来进行表征学习,使得算法模型更健壮
    纳什均衡——非合作博弈,囚徒困境
    每当有人问我数据不均衡的处理时候,我推荐他使用smote
  • 原文地址:https://www.cnblogs.com/peekapoooo/p/14327421.html
Copyright © 2011-2022 走看看