java 通用树结构

有问题勿喷(手动狗头)

 

public class TreeNode<T> {

    String key;//节点key
    T value;//节点数据
    TreeNode<T>[] subNode;//当前节点子节点集
    private static final int LEN = 5;//默认子集长度

    public TreeNode(T value, String key) {
       new TreeNode<T>(value,key,LEN);
    }

    @SuppressWarnings("unchecked")
    public TreeNode(T value, String key, int maxSubNode) {
        this.value = value;
        this.key = key;
        this.subNode = (TreeNode<T>[]) Array.newInstance(this.getClass(), maxSubNode);
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }

    public TreeNode<T>[] getSubNode() {
        return subNode;
    }

    public void setSubNode(TreeNode<T>[] subNode) {
        this.subNode = subNode;
    }

    @Override
    public String toString() {
        return "Node [key=" + key + ", value=" + value + ", subNode=" + Arrays.toString(subNode) + "]";
    }
}

public class TreeUtils<T> {
    public static <T> Result delNode(TreeNode<T> tree, String delkey) {
        Result result = new Result();
        if (EmptyUtil.isEmpty(tree) || EmptyUtil.isEmpty(delkey)) {
            return result.setFailMsg("空树或空key");
        }
        if(tree.getKey().equals(delkey)){
            return result.setReturnObject(null);
        }
        TreeNode<T>[] subNode = tree.getSubNode();
        if(EmptyUtil.isEmpty(subNode)){
            return result.setFailMsg("未找到符合的delkey");
        }
        subNode = delNodeByDelkey$Recursive(subNode,delkey);
        tree.setSubNode(subNode);
        result.setResultObject(tree);
        return result;
    }
    
    private static <T> TreeNode<T>[] delNodeByDelkey$Recursive(TreeNode<T>[] subTree,String delkey) {
        TreeNode<T> node ;
        for(int i =0,len = subTree.length; i < len; i++){
            node = (TreeNode<T>) subTree[i];
            if(EmptyUtil.isEmpty(node)){
                continue;
            }
            if(delkey.equals(node.getKey())){
                subTree[i] = null;
                continue;
            }
            TreeNode<T>[] tempSubs =  node.getSubNode();
            if(EmptyUtil.isNotEmpty(tempSubs)){
                tempSubs = delNodeByDelkey$Recursive(tempSubs,delkey);
            }
            node.setSubNode(tempSubs);
        }
        return subTree;
    }
    
    public static <T> Result addNode(String addKey,TreeNode<T> tree,TreeNode<T> node){
        Result reuslt = new Result();
        if(EmptyUtil.isEmpty(addKey) || EmptyUtil.isEmpty(tree) || EmptyUtil.isEmpty(node)){
           return reuslt.setFailMsg("空key或空树或空节点");
        }
        TreeNode<T>[] subTree = tree.getSubNode();
        subTree = addNodeToTreeByKey(addKey,tree.getKey(),node,subTree);
        tree.setSubNode(subTree);
        reuslt.setResultObject(tree);
        return reuslt;
    }
    
    private static <T> TreeNode<T>[] addNodeToTreeByKey(String addkey, String parentkey,TreeNode<T> node, TreeNode<T>[] subTree) {
        TreeNode<T> tempNode;
        for(int i = 0,len = subTree.length; i < len; i++){
            tempNode = subTree[i];
            if(!addkey.equals(parentkey)){
                if(EmptyUtil.isNotEmpty(tempNode)){
                    TreeNode<T>[] tempSubs = tempNode.getSubNode();
                    tempSubs = addNodeToTreeByKey(addkey,tempNode.getKey(),node,tempSubs);
                }
                continue;
            }
            if(EmptyUtil.isEmpty(tempNode)){
                subTree[i] = node;
            } 
        }
        return subTree;
    }
}

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        TreeNode<String> tree = new TreeNode<String>("root数据", "root", 1);
        
        TreeNode<String> first1 = new TreeNode<String>("first1", "first1", 1);
        TreeNode<String>[] aaa = (TreeNode<String>[]) Array.newInstance(TreeNode.class, 4);
        aaa[0] = first1;
        aaa[1] = first1;
        tree.setSubNode(aaa);
        System.err.println("----原树:" + tree);
        
        TreeNode<String> first2 = new TreeNode<String>("first2", "first2", 1);
        Result result = TreeUtils.addNode("first1",tree,first2);
        tree = (TreeNode<String>) result.getResultObject();
        System.err.println("加入节点:" + tree);
        
        Result result2 = TreeUtils.delNode(tree, "first2");
        tree = (TreeNode<String>) result2.getResultObject();
        System.err.println("删除节点:" + tree);
        
        
        Object obj = finfNumber(2);
        System.err.println(obj);
    }

 

 

$(function(){ $.fn.extend({ SimpleTree:function(options){ //初始化参数 var option = $.extend({ click:function(a){ } },options); option.tree=this; /* 在参数对象中添加对当前菜单树的引用,以便在对象中使用该菜单树 */ option._init=function(){ /* * 初始化菜单展开状态,以及分叉节点的样式 */ this.tree.find("ul ul").hide(); /* 隐藏所有子级菜单 */ this.tree.find("ul ul").prev("li").removeClass("open"); /* 移除所有子级菜单父节点的 open 样式 */ this.tree.find("ul ul[show='true']").show(); /* 显示 show 属性为 true 的子级菜单 */ this.tree.find("ul ul[show='true']").prev("li").addClass("open"); /* 添加 show 属性为 true 的子级菜单父节点的 open 样式 */ }/* option._init() End */ /* 设置所有超链接不响应单击事件 */ this.find("a").click(function(){ $(this).parent("li").click(); return false; }); /* 菜单项 接受单击 */ this.find("li").click(function(){ /* * 当单击菜单项 * 1.触发用户自定义的单击事件,将该 标签中的第一个超链接做为参数传递过去 * 2.修改当前菜单项所属的子菜单的显示状态(如果等于 true 将其设置为 false,否则将其设置为 true) * 3.重新初始化菜单 */ option.click($(this).find("a")[0]); /* 触发单击 */ /* * 如果当前节点下面包含子菜单,并且其 show 属性的值为 true,则修改其 show 属性为 false * 否则修改其 show 属性为 true */ /* if($(this).next("ul").attr("show")=="true"){ $(this).next("ul").attr("show","false"); }else{ $(this).next("ul").attr("show","true"); }*/ /* 初始化菜单 */ option._init(); }); /* 设置所有父节点样式 */ this.find("ul").prev("li").addClass("folder"); /* 设置节点“是否包含子节点”属性 */ this.find("li").find("a").attr("hasChild",false); this.find("ul").prev("li").find("a").attr("hasChild",true); /* 初始化菜单 */ option._init(); }/* SimpleTree Function End */ }); });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值