多叉树的一些算法

import com.nfschina.iot.iotdroid.model.Node;


public class NodeUtils {
	/**
	 * 
	 * @description: 初始化树
	 * @param nodeList
	 * @return
	 * 
	 */
	public static Node initNode(HashMap<Object, ? extends Node> nodeList) {
		Node root = null;
		// 构造无序的多叉树
		Set<?> entrySet = nodeList.entrySet();
		for (Iterator<?> it = entrySet.iterator(); it.hasNext();) {
			@SuppressWarnings("rawtypes")
			Node node = (Node) ((Map.Entry) it.next()).getValue();
			if (node.getParentId() == null || node.getParentId().equals("-1")) {
				root = node;
			} else {
				Node bean = (Node) nodeList.get(node.getParentId());
				if (bean.getChildren() == null) {
					// bean.children=new ArrayList<Node>();
					bean.setChildren(new ArrayList<Node>());
				}
				bean.getChildren().add(node);
			}
		}
		// 功能叶子列表

		// 构造功能叶子列表
		initializeLeafList(root);
		// 对多叉树进行横向排序
		sortChildren(root);
		return (Node) root;
	}

	// 广度优先遍历,对子节点进行横向排序
	private static void sortChildren(Node root) {
		List<Node> children = root.getChildren();
		if (children != null && children.size() != 0) {
			// 对本层节点进行排序
			Collections.sort(children, new NodePriorityComparator());
			// 对每个节点的下一层节点进行排序
			for (Iterator<Node> it = children.iterator(); it.hasNext();) {
				sortChildren(it.next());
			}
		}
	}

	private static List<Node> leafList = new ArrayList<Node>();
	// 深度优先先序遍历,构造功能叶子列表
	public static void initializeLeafList(Node root) {
		List<Node> children = root.getChildren();
		if (children == null || children.size() == 0) {
			leafList.add(root);
		} else {
			for (Iterator<Node> it = children.iterator(); it.hasNext();) {
				initializeLeafList(it.next());

			}
		}

	}

	public static Node initNode(String[] nodeList) {
		return NodeUtils.initNode(nodePackager(nodeList,0));

	}
	public static Node initNode(String[] nodeList ,int init_num) {
		return NodeUtils.initNode(nodePackager(nodeList,init_num));
		
	}

	public static HashMap<Object, Node> nodePackager(String[] info,int init_num) {
		HashMap<Object, Node> nodeList = new LinkedHashMap<Object, Node>(0);
		for (int i = init_num; i < info.length; i++) {
			Node n=new Node();
			String itemArr[] = info[i].split(":");
			n.setId(itemArr[0]);
			n.setName(itemArr[1]);
			n.setParentId(itemArr[2]);
			n.setLft(Integer.valueOf(itemArr[3]));
			n.setRgt(Integer.valueOf(itemArr[4]));
			nodeList.put(n.getId(), n);
		}

		return nodeList;
	}

	private static int count=0;
	private static Node tempNode;
	private static String id;
	private static void findNodeByID(Node root,String id){
		count++;
		for(Node node:root.getChildren()){
			if(node.getId().equals(id)){
				System.out.print("find it:" + id + " the count is " + count);
				tempNode=node;
				break;
			}else if(node.getChildren()==null || 0==node.getChildren().size()){
				continue;
			}else {
				findNodeByID(node,id);
			}
		}
	}



	/**
	 * 
	 * @description:  返回所有叶子
	 * @return
	 *
	 */
	private static List<Node> leafNode;
	public static List<Node> getAllLeaf(Node root){
		leafNode=new ArrayList<Node>();
		getLeaf(root);
		return leafNode;
	}
	private static void getLeaf(Node root){
		count++;
		for(Node node:root.getChildren()){
			if(node.getChildren()==null || 0==node.getChildren().size()){
				leafNode.add(node);
				continue;
			}else {
				getLeaf(node);
			}
		}
	}
	/**
	 * 由Node获取深度链
	 */
	private static List<Node> deapNodeList;

	public static List<Node> getDeapLink(Node root, Node node) {
		putTree2List(root);
		deapNodeList = new ArrayList<Node>();
		getDeap(node);
		deapNodeList.add(root);
		return deapNodeList;
	}

	private static void getDeap(Node tempNode) {

		for (Node node : allList) {
			if (node.getId().equals(tempNode.getParentId())) {
				deapNodeList.add(tempNode);
				getDeap(node);
			}
		}
	}

	/**
	 * 
	 * @description: 多叉树列表化
	 * @param root
	 * 
	 */
	static List<Node> allList;

	private static void putTree2List(Node root) {
		if (null == allList)
			allList = new ArrayList<Node>();
		allList.add(root);
		for (Node node : root.getChildren()) {
			if (node.getChildren() != null && 0 != node.getChildren().size()) {// 不是叶子
				putTree2List(node);
			} else
				allList.add(node);
		}
	}
}

public class Node  {


	private String id;

	private String name;

	private String parentId;

	private List<Node> children;

	private Integer lft;

	private Integer rgt;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}



	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getParentId() {
		return parentId;
	}

	public void setParentId(String parentId) {
		this.parentId = parentId;
	}

	public List<Node> getChildren() {
		return children;
	}

	public void setChildren(ArrayList<Node> arrayList) {
		this.children = arrayList;
	}

	public Integer getLft() {
		return lft;
	}

	public void setLft(Integer lft) {
		this.lft = lft;
	}

	public Integer getRgt() {
		return rgt;
	}

	public void setRgt(Integer rgt) {
		this.rgt = rgt;
	}




	


	
}

 import java.util.HashMap;

import java.util.LinkedHashMap;
import java.util.List;

public class NODEtest {
	public static void main(String[] args) {
		// id:text:pid:lid:rid
		String info = "1," + "1:化肥:-1:1:30," + "2:有机肥:1:2:9,"
				+ "3:无机肥:1:10:15," + "4:其他肥:1:16:27," + "5:化肥4:1:28:29,"
				+ "6:猪粪1:2:3:4," + "7:猪粪2:2:5:6," + "8:猪粪3:2:7:8,"
				+ "9:氮肥1:3:11:12," + "10:氮肥2:3:14:15," + "11:其他肥料1:4:17:18,"
				+ "12:其他肥料2:4:19:20,"
				+ "13:其他肥料3:4:21:22,"
				+ "15:NEW:14:24:25,"
				+ "14:其他肥料4:4:23:26";
		String[] infoArr = info.split(",");
		HashMap<Object, Park> nodeList = new LinkedHashMap<Object, Park>(0);
		for (int i = 1; i < infoArr.length; i++) {
			Park n = new Park();
			String itemArr[] = infoArr[i].split(":");
			// n.id=itemArr[0];
			// n.text=itemArr[1];
			// n.parentId=itemArr[2];
			// n.lft=Integer.valueOf(itemArr[3]);
			// n.rgt=Integer.valueOf(itemArr[4]);
			n.setII("i= " + i);
			n.setId(itemArr[0]);
			n.setName(itemArr[1]);
			n.setParentId(itemArr[2]);
			n.setLft(Integer.valueOf(itemArr[3]));
			n.setRgt(Integer.valueOf(itemArr[4]));
			nodeList.put(n.getId(), n);
		}

		Node node = NodeUtils.initNode(nodeList);
		String s = ((Park) node).getII();
//		NodeUtils sss = new NodeUtils();
//		Node node3 = sss.findNodeByID(node, String.valueOf(6));
		NodeUtils.getAllLeaf(node).size();
//		System.out.println(NodeUtils.getAllLeaf(node).size());
		List<Node> list=NodeUtils.getDeapLink(node, NodeUtils.findNodeByID(node, "15"));
		for (int i = 0; i < list.size(); i++) {
//			Node node2 = sss.findNodeByID(node, String.valueOf(i));
//			System.out.println(node2.getName());
			System.out.print(list.get(i).getId()+", ");
		}
		System.out.println();
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i).getName()+", ");
		}
	}
}

 

much time!!

你可能感兴趣的:(算法)