zoukankan      html  css  js  c++  java
  • 多叉树的建立以及其他的一些操作

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    
    
    public class TreeNode {
    	public int id;
    	List <TreeNode>childList;
    	String nodeName;
    	double nodeValue;
    
    
    
    	int ParentId;
    
    	public void initChildTree(){
    		if(this.getChildList()==null){
    			this.childList = new ArrayList();
    		}
    	}
    	//向当前节点插入node
    	public void insertTree(TreeNode node){
    		initChildTree();
    		node.setId(++selfid);
    		this.childList.add(node);
    	}
    
    	//根据节点的ParentId插入树种对应的ParentId的子节点中
    	public void insertTreeByParentId(TreeNode node){
    		if(node.ParentId==this.ParentId){
    			node.setId(++selfid);
    			this.childList.add(node);
    			
    		}else{
    			List<TreeNode>child = this.getChildList();
    			for(int i = 0;i<child.size();i++){
    				child.get(i).insertTreeByParentId(node);
    			}
    		}
    
    	}
          //删除最近的节点 public void delectNow(){ delectById(selfid); selfid = selfid-1; } //根据id删除节点 public boolean delectById(int id){ if(this.childList==null){ return false; } int childNum = this.getChildList().size(); for(int i = 0;i<childNum;i++){ if(this.getChildList().get(i).getId()==id){ this.getChildList().remove(i); return true; }else{ this.getChildList().get(i).delectById(id); } } return false; } //根据id找到树种某一个节点 public TreeNode findTreeNodeById(int id) { TreeNode t =new TreeNode(); if(this.id==id){ return this; }else{ List <TreeNode>child = this.getChildList(); for(int i = 0;i<child.size();i++){ t=child.get(i).findTreeNodeById(id); if(t.nodeName!=null){ return t; } } } return t; } //将数组中每一组数据作为一列,添加到data中,attribute表示属性列 static int selfid = 0; public TreeNode creatTree(TreeNode tree,List<ArrayList<Double>>data,List<String>attribute){ if(tree==null){ tree = new TreeNode(); tree.setId(selfid); tree.setNodeName("start"); tree.setNodeValue(0); tree.setChildList(new ArrayList()) ; } if(attribute.size()==0){ return tree; } List<Double>value = new ArrayList();//用于记录data第0列中不重复的属性 List<List<ArrayList<Double>>>childD = new ArrayList();//用于记录data第0列中不重复的属性所对应的数据列 for(int i = 0;i<data.size();i++){ if(!value.contains(data.get(i).get(0))){ value.add(data.get(i).get(0)); } } //针对每一个value值,找到对应的childD for(int i = 0;i<value.size();i++){ List<ArrayList<Double>> temp = new ArrayList<ArrayList<Double>>(); for(int j = 0;j<data.size();j++){ if(data.get(j).get(0).equals(value.get(i))){ temp.add(data.get(j)); } } // for(int k = 0;k<temp.size();k++){ // for(int j = 0;j<temp.get(k).size();j++){ // System.out.print(temp.get(k).get(j)); // } // System.out.println(); // } childD.add(temp); } String NodeName = attribute.get(0); for(int i = 0;i<value.size();i++){ TreeNode leafNode = new TreeNode(); leafNode.setParentId(tree.getId()); leafNode.setId(++selfid); leafNode.setNodeName(NodeName); leafNode.setNodeValue(value.get(i)); leafNode.setChildList(new ArrayList()); tree.getChildList().add(leafNode); for(int j = 0;j<childD.get(i).size();j++){ childD.get(i).get(j).remove(0); } ArrayList<String> resultAttr = new ArrayList<String>(attribute); resultAttr.remove(0); creatTree(leafNode,childD.get(i),resultAttr); } return tree; } //遍历整个树 public void traverse(){ System.out.println(this.getId()+"---"+this.getNodeName()+": "+this.getNodeValue()); if(this.childList==null){ return; } int childNum = this.getChildList().size(); System.out.println(childNum); if(childNum==0){ return; }else{ for(int i = 0;i<childNum;i++){ TreeNode childNode = this.getChildList().get(i); childNode.traverse(); } } } //求两个节点最近的公共祖先 public TreeNode FindParent(TreeNode node1,TreeNode node2){ List <TreeNode>list1 = new ArrayList(); List <TreeNode>list2 = new ArrayList(); list1 = getAllParentNode(node1); list2 = getAllParentNode(node2); TreeNode result = new TreeNode(); boolean flag = false; for(int i = 0;i<list1.size();i++){ TreeNode temp1 = (TreeNode) list1.get(i); int temp1Id = temp1.getId(); for(int j = 0;j<list2.size();j++){ TreeNode temp2 = (TreeNode) list2.get(j); int temp2Id = temp2.getId(); if(temp1Id==temp2Id){ flag = true; break; } } if(flag){ result = temp1; break; } } return result; } //得到所有父节点 public List getAllParentNode(TreeNode node){ List<TreeNode> Parent = new ArrayList(); if(node.getId()==0){ return Parent; }else{ int ParentId = node.getParentId(); TreeNode P = findTreeNodeById(ParentId); Parent.add(P); Parent.addAll(getAllParentNode(P)); return Parent; } } //得到所有子节点 public List getAllChildNode(TreeNode node){ List<TreeNode> Child = new ArrayList(); if(node.childList==null){ return Child; }else{ int childNum = node.getChildList().size(); for(int i = 0;i<childNum;i++){ Child.add(node.getChildList().get(i)); Child.addAll(getAllChildNode(node.getChildList().get(i))); } return Child; } } //求树的深度 public int DepthOfTree(TreeNode node){ int childNum1 = node.getChildList().size(); System.out.println(node.id+": "+childNum1+" ,"+node.getNodeName()); if(childNum1==0){ return 1; }else{ int childNum = node.getChildList().size(); int []Count = new int [childNum]; for(int i = 0;i<childNum;i++){ Count[i] = DepthOfTree(node.getChildList().get(i))+1; } int maxCount = Count[0]; for(int i = 1;i<Count.length;i++){ if(maxCount<Count[i]){ maxCount = Count[i]; } } return maxCount; } } public double getNodeValue() { return nodeValue; } public void setNodeValue(double nodeValue) { this.nodeValue = nodeValue; } public int getId() { return id; } public void setId(int id) { this.id = id; } public List<TreeNode> getChildList() { return childList; } public void setChildList(List<TreeNode> childList) { this.childList = childList; } public String getNodeName() { return nodeName; } public void setNodeName(String nodeName) { this.nodeName = nodeName; } public int getParentId() { return ParentId; } public void setParentId(int parentId) { ParentId = parentId; } }
  • 相关阅读:
    Android 按键消息处理Android 按键消息处理
    objcopy
    SQLite多线程读写实践及常见问题总结
    android动画坐标定义
    Android动画效果translate、scale、alpha、rotate
    Android公共库(缓存 下拉ListView 下载管理Pro 静默安装 root运行 Java公共类)
    Flatten Binary Tree to Linked List
    Distinct Subsequences
    Populating Next Right Pointers in Each Node II
    Populating Next Right Pointers in Each Node
  • 原文地址:https://www.cnblogs.com/yunerlalala/p/6129402.html
Copyright © 2011-2022 走看看