最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 前端就该用 JS 刷算法19

    正文概述 掘金(厨猿加加)   2021-01-19   443

    每日一题 -- 树

    783. 二叉搜索树节点最小距离

    783. 二叉搜索树节点最小距离

    二叉树的特性求解

    • 二叉搜索树一出,就应该考虑中序遍历,然后题目求的是最小距离,那必然是两个单增数列中响铃的两个节点之差
    • 由于求差,所以不需要维护数组,只要变量即可
    // https://leetcode-cn.com/problems/minimum-distance-between-bst-nodes/
    // 783. 二叉搜索树节点最小距离
    
    /**
     * @分析
     * 1. 看到二叉搜索树就想到中序遍历是一个有序递增数组,最小的肯定是在相邻的节点之间
     */
    var minDiffInBST = function (root) {
        if (!root) return 0
        let min = Infinity
        let temp = null
        const dfs = root => {
            if (!root) return
            dfs(root.left)
            if (temp) {
                min = Math.min(min, root.val - temp)
            }
            temp = root.val
            dfs(root.right)
        }
        dfs(root)
        return min
    };
    

    参数扩展大发法

    • 我们求整棵树的极值的时候,可以想到求两科子树符合条件的值,然后最后比较返回最终值即可
    • 这里用到的是自顶向下的思考方式,然后要求的是最小值,所以在遍历过程中,携带最大和最小两个扩展参数,即可求得相应的值
    • 对于根节点而言,直接正反无穷就是最大最小值
    • 对于子树节点而言,向下递归过程需要考虑缩小最大或者最小值,以求得真实的解
    • 在这里由于是二叉搜索树,所以在左树递归的时候,根节点的值肯定大于左树的所有值,所以 upper 是 root.val
    • 同理,右子树中,根节点的值肯定是最小值
    • 这种方式可以处理非二叉搜索树的其他办法
    
    /**
     * 扩展参数法
     * @分析
     * 1. 自顶向下求子树中最小的距离
     */
    var minDiffInBST = function (root) {
    
        const dfs = (root, lower, upper) => {
            if (!root) return upper - lower
            const left = dfs(root.left, lower, root.val)
            const right = dfs(root.right, root.val, upper)
            return Math.min(left, right)
        }
        return dfs(root, -Infinity, Infinity)
    }
    

    91算法 -- 搜索

    113. 路径总和 II

    113. 路径总和 II

    // https://leetcode-cn.com/problems/path-sum-ii/
    // 113. 路径总和 II
    
    /**
     * 
     * @分析
     * 1. 必须是根节点到叶子节点的路径,所以截止条件就是叶子条件
     * 2. 找和,那就需要自顶向下计算值,所以扩展参数记录总和值
     * 3. 最后返回的是路径数组,所以还得给一个扩展参数为数组
     */
    var pathSum = function(root, sum) {
        if(!root) return []
        const res = []
        const dfs = (root,num,arr) => {
            const temp = num+root.val
            if(!root.left && !root.right){
                if(temp === sum){
                    res.push([...arr,root.val])
                }
                return
            }
            if(root.left){
                dfs(root.left,temp,[...arr,root.val])
            }
            if(root.right){
                dfs(root.right,temp,[...arr,root.val])
            }
        }
        dfs(root,0,[])
        return res
    };
    

    起源地下载网 » 前端就该用 JS 刷算法19

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元