算法实现筛选出树上符合要求的某一条路径的节点

有如图所示的关系图,实现筛选出从5、4、3、2、1开始,包含16、17、18、19、21、22、23、24、25、26节点的路径。可以扩展到选择树中符合条件的某一条路径上的节点`

有如图所示的关系图,实现筛选出从5、4、3、2、1开始,包含16、17、18、19、21、22、23、24、25、26节点的路径。可以扩展到选择树中符合条件的某一条路径上的节点

public class Test7 {

private int param;
private int minId;
private int minId2;
private ArrayList<MyComponent> list;
private ArrayList<Integer> subIdList;

public Test7() {

    list=new ArrayList<MyComponent>(); 
    MyComponent c2=new MyComponent(6, 17);
    MyComponent c3=new MyComponent(6, 18);
    MyComponent c4=new MyComponent(6, 16);
    MyComponent c6=new MyComponent(15, 28);
    MyComponent c7=new MyComponent(15, 27);

    MyComponent c9=new MyComponent(13, 26);
    MyComponent c10=new MyComponent(13, 25);
    MyComponent c11=new MyComponent(13, 14);
    MyComponent c12=new MyComponent(13, 29);
    MyComponent c14=new MyComponent(20, 8);
    MyComponent c16=new MyComponent(9, 33);
    MyComponent c17=new MyComponent(34, 9);
    MyComponent c18=new MyComponent(35, 9);
    MyComponent c19=new MyComponent(11, 9);
    MyComponent c20=new MyComponent(11, 24);
    MyComponent c21=new MyComponent(11, 23);
    MyComponent c22=new MyComponent(11, 32);
    MyComponent c24=new MyComponent(10, 21);
    MyComponent c25=new MyComponent(10, 30);
    MyComponent c26=new MyComponent(12, 22);
    MyComponent c27=new MyComponent(12, 31);
    MyComponent c28=new MyComponent(7, 8);
    MyComponent c29=new MyComponent(7, 19);
    MyComponent c30=new MyComponent(10, 12);

    MyComponent c23=new MyComponent(5, 10);
    MyComponent c15=new MyComponent(4, 9);
    MyComponent c13=new MyComponent(3, 7);
    MyComponent c8=new MyComponent(2, 13);
    MyComponent c1=new MyComponent(1, 6);
    MyComponent c5=new MyComponent(1, 15);

    //顺序 放到最后
    list.add(c1);
    list.add(c5);
    list.add(c8);
    list.add(c15);
    list.add(c23);
    list.add(c13);


    list.add(c2);
    list.add(c3);
    list.add(c4);
    list.add(c6);
    list.add(c7);
    list.add(c9);
    list.add(c10);
    list.add(c11);
    list.add(c12);
    list.add(c14);
    list.add(c16);
    list.add(c17);
    list.add(c18);
    list.add(c19);
    list.add(c20);
    list.add(c21);
    list.add(c22);
    list.add(c24);
    list.add(c25);
    list.add(c26);
    list.add(c27);
    list.add(c28);
    list.add(c29);
    list.add(c30);


    //迭代
    subIdList=new ArrayList<Integer>();
    subIdList.add(15);
    subIdList.add(16);
    subIdList.add(17);
    subIdList.add(18);
    subIdList.add(19);
    subIdList.add(20);
    subIdList.add(21);
    subIdList.add(22);
    subIdList.add(23);
    subIdList.add(24);
    subIdList.add(25);
    subIdList.add(26);



    subIdList.add(1);
    subIdList.add(2);
    subIdList.add(3);
    subIdList.add(4);
    subIdList.add(5); 
    subIdList.add(15);
    subIdList.add(6);
    subIdList.add(7);
    subIdList.add(8);
    subIdList.add(9);
    subIdList.add(10);
    subIdList.add(11);
    subIdList.add(12);
    subIdList.add(23);
    subIdList.add(14);
    subIdList.add(27);
    subIdList.add(28);
    subIdList.add(29);
    subIdList.add(30);
    subIdList.add(31);
    subIdList.add(32);
    subIdList.add(33);
    subIdList.add(34);
    subIdList.add(35);


    minId=0;
    minId2=0;
    for(int i=0;i<subIdList.size();i++){
        param=subIdList.get(i);
        MyMethod(param,list);
    }

    for(int i=0;i<list.size();i++){
        System.out.println(list.get(i).getStartId()+" aaaa "+list.get(i).getEndId());
    }
}

private void MyMethod(int subId,ArrayList<MyComponent> list) {
    /*
     * 5、4、3、2、1表示每一条路径的开始节点
     * 
     * 16、17、18、19、21、22、23、24、25、26表示将要筛选的路径上的最终节点
     * */
    if(subId!=5&&subId!=4&&subId!=3&&subId!=2&&subId!=1){

        for(int i=0;i<list.size();i++){

            int sId=list.get(i).getStartId();
            int eId=list.get(i).getEndId();

            if((subId==sId||subId==eId)){
                minId=subId==eId?sId:eId;
                if(!judgeFinal(subId, minId)){
                    if(minId!=minId2){
                        if(minId!=5&&minId!=4&&minId!=3&&minId!=2&&minId!=1){
                            //判断是不是zui后一个节点
                            if(!judgeFinal(minId, subId)){
                                minId2=subId;
                                MyMethod(minId, list); 
                            }else if(minId!=16&&minId!=17&&minId!=18
                                    &&minId!=19&&minId!=21&&minId!=22
                                    &&minId!=23&&minId!=24&&minId!=25&&minId!=26
                                    ){

                                minId2=0;
                                list.remove(i);
                                MyMethod(param, list);
                            }
                        }else{
                            continue;
                        }
                    } 
                }
                else if(subId!=16&&subId!=17&&subId!=18
                        &&subId!=19&&subId!=20&&subId!=21&&subId!=22
                        &&subId!=23&&subId!=24&&subId!=25&&subId!=26
                        ){
                    minId2=0;
                    list.remove(i);
                    MyMethod(param, list);
                }
            }
        }
    }else{
        return;
    }
}

/*
判断是不是最后一个节点
*/
private boolean judgeFinal(int id1,int id2){

        ArrayList<Integer> myList=new ArrayList<Integer>();
        for(int i=0;i<list.size();i++){
            int sId=list.get(i).getStartId();
            int eId=list.get(i).getEndId();
            if((id1==sId||id1==eId)){
                int id3 = id1==eId?sId:eId;
                myList.add(id3);
            }
        }

        if(myList.size()==1&&(myList.get(0)==id2)){
            return true;
        }else {
            return false;
        }
}
public static void main(String[] args) {
    new Test7();
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值