• 竞赛03. 重复的彩灯树


    这个题有bug,最后输出的list不要求顺序,是乱序的,有点无语,导致测试没完全通过

    思路:

    1、想找到最小的节点,判断他们是否重复,重复的为新的子节点,找到他们的父节点

    2、继续上一步判断,从子节点到父节点找

    题目-03. 重复的彩灯树

     
    • 通过的用户数303
    • 尝试过的用户数343
    • 用户总通过次数311
    • 用户总提交次数680
    • 题目难度Medium

    有一棵结构为二叉树的圣诞树 root 挂满了彩灯,各节点值表示彩灯的颜色。

    如果两棵子树具有 相同的结构 和 相同的彩灯颜色分布,则它们是 重复 的。

    请返回这棵树上所有 重复的子树。

    注意:

    • 对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。

    示例 1:

    输入:root = [1,3,3,null,2,null,2]
    输出:[[3,null,2],[2]]

    示例 2:

    输入:root = [3,3,2,null,2]
    输出:[[2]]

    示例 3:

    输入:root = [1,3,3,null,2,2]
    输出:[[2]]

    提示:

    • 树中的结点数在[1,6000]范围内。
    • -200 <= Node.val <= 200
    /**
     * Definition for a binary tree node.
     * function TreeNode(val, left, right) {
     *     this.val = (val===undefined ? 0 : val)
     *     this.left = (left===undefined ? null : left)
     *     this.right = (right===undefined ? null : right)
     * }
     */
    /**
     * @param {TreeNode} root
     * @return {TreeNode[]}
     */
    var lightDistribution = function(root) {
        function isEqual(node1,node2){
            if(node1===null&&node2===null){
                return true
            }else if(node1===null){
                return false
            }else if(node2===null){
                return false
            }
            return node1.val===node2.val&&isEqual(node1.left,node2.left)&&isEqual(node1.right,node2.right)
        }
        let preList=[]
        const parentArr=[]
        const nlist=[root]
        let n=0;
        while(n<nlist.length){
          
            const node=nlist[n]
            if(node.left!==null){
                parentArr[nlist.length]=n
               nlist.push(node.left)
           }
            if(node.right!==null){
                parentArr[nlist.length]=n
                 nlist.push(node.right)
            }
            if(node.left===null&&node.right===null){
               preList.push(n)
            }
           n++
       }
        const cArr=[]
        while(preList.length>1){
            const list=[]
            
            for(let i=0;i<preList.length;i++){
                const node=nlist[preList[i]]
                for(let j=i+1;j<preList.length;j++){
                    if(isEqual(node,nlist[preList[j]])){
                        if(list.indexOf(preList[i])===-1){
                            list.push(preList[i])
                            cArr.unshift(preList[i])
                        }
                        list.push(preList[j])
                        preList.splice(j,1)
                    }
                }
            }
            //得出重复节点的list
            const pList=[]
            for(let i=0;i<list.length;i++){
                const pn=parentArr[list[i]]
                if(pList.indexOf(pn)===-1){
                     pList.push(pn)
                }
            }
            console.log(cArr)
            preList=pList
        }
        
        return cArr.map((a)=>nlist[a])
        
    };
  • 相关阅读:
    根据不同的窗口尺寸来选择不同的样式
    用JavaScript检测视频格式支持
    用JavaScript检测音频格式支持
    C#取整函数Math.Round、Math.Ceiling和Math.Floor
    asp.net在同一页面跳转到指定位置
    对存储过程进行加密和解密
    各种SQL语句
    centos7.2安装nginx
    springboot利用mock进行junit单元测试,测试controller
    centos7环境搭建一台mysql服务器启动多个端口
  • 原文地址:https://www.cnblogs.com/caoke/p/16747591.html
Copyright © 2020-2023  润新知