【递归】树形断层判断算法

场景node

        最近在接了个需求,其中有个树形结构的勾选方式逻辑判断比较复杂,断层选择须要进行逻辑判断,什么是断层?看下图给你解释:算法

 

   

        黑色表明当前结点被勾选上,白色表明未勾选,上图描述了断层的逻辑,意思就是,有关联的一条线上的节点,假如中间一个节点没有勾选上,证实这就是断层。this

 

分析spa

     注意,每个节点就是一个对象,对象里面有属性,一个id,一个pid,pid就是当前节点的父节点,这样才能构成上面的树形。对象

 

方法一:blog

  解决问题的思路就是,递归循环判断3个连续的节点,就好了。经过递归判断当前选中的节点的爷父,3个节点,若是子节点、爷节点勾选上了,父节点没有勾选上,证实断层。递归

 

代码实现get

checkNode : function(curGid, selectRowids,allData) {
    var that=this;
    var pid = "";
    for (var i = 0; i < allData.length; i++) {
        if (allData[i].gid == curGid) { // allData是这个树的全部节点对象集合
    	    pid = allData[i].pgid;
    	    break;
    	}
    }
    if (pid=='#'||pid == undefined) {
         return true;
    } else {
    	 var ppid = "";
    	 for (var i = 0; i < allData.length; i++) {
    	     if (allData[i].gid == pid) {
    	         ppid = allData[i].pgid;
    	         break;
    	     }
    	 }
    	 // 若是当前子节点的上级节点没有勾选,而且当前节点的上上级节点勾选了,说明断层了。
    	 if (selectRowids.indexOf(pid) == -1 && selectRowids.indexOf(ppid)>-1) {
    	     return false;
    	  } else {
        // 这里最叼,递归当前结点的上一个节点!!! return this.checkNode(pid, selectRowids, allData); } } }

 

方法二:io

  解决问题的思路就是,找出当前选中的节点集合,for循环每个选中的节点,而后经过递归方式,获取当前选中节点的祖先集合,而后按照顺序判断最顶层祖先(一级),若是没勾选,就无论它,而后接着判断最顶层祖先的下级祖先(二级),若是有勾选,那么判断三级是否勾选,若是没勾选上,证实断层!这种方法更加的简单暴力。不过期间复杂度比第一种方法要大。for循环

 

循环当前选中节点递归获取全部上级节点算法

// node 表明当前循环的选中节点, upNodeList 表明当前节点的全部上级对象集合 allNode 表明这个树的全部节点集合
var getUpNode = function (node, upNodeList,allNode) {
    var pNode = [];
    for (var i = 0; i < allNode.length; i++) {
        if (node.pid == allNode[i].id) {
            pNode = allNode[i]
            if (pNode.pid == "#" || pNode.pid == undefined) { //若是该节点就是一级节点
                return UpNodeList;
            }
            this.getUpNode(pNode, UpNodeList, this.allNode)
        }
    }
}

 

  

附件

附上个人页面效果图,增强一下印象

 

 

 --end--

相关文章
相关标签/搜索