码迷,mamicode.com
首页 > 其他好文 > 详细

多叉树的建立以及其他的一些操作

时间:2016-12-03 21:28:47      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:操作   port   str   dev   ndt   self   java   ble   节点   

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; } }

 

多叉树的建立以及其他的一些操作

标签:操作   port   str   dev   ndt   self   java   ble   节点   

原文地址:http://www.cnblogs.com/yunerlalala/p/6129402.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!