Java实现树型数据结构

时间:2022-05-16 12:28:30

针对树型数据结构,用Java实现需要3个类。写成3个类只是为了提高代码的复用性,减少节点和节点属性之间的耦合。
1. Tree,实现树的数据结构,负责操作节点,增删改查。
2. Node,记录节点的父子节点,有一个节点属性类
3. NodeProp,记录节点中相关的属性,并提供具体的属性的搜索方法。


Node类为树的节点类。负责处理节点相关的操作,记录了子节点和父节点的信息,有一个负责处理节点属性的类NodeProp。

public class Node {
	
	private Node parent;
	private ArrayList<Node> childrenNodes = null;
	
	private NodeProp mNodeProp = null;
	
	public Node(Node parent) {
		this.parent = parent;
		childrenNodes =  new ArrayList<>();
		mNodeProp = new NodeProp();
	}
	
	final public ArrayList<Node> getChildList(){
		return childrenNodes;
	}
	
	final public Node getParent(){
		return parent;
	}
	
	final public void addChild(Node node){
		childrenNodes.add(node);
	}
	
	final public void deleteChild(int index){
		childrenNodes.remove(index);
	}
	
	final public boolean hasChild(){
		
		if (childrenNodes.size() > 0) {
			return true;
		}
		
		return false;
	}
	
	final public int getChildrenSize(){
		return childrenNodes.size();
	}
	
	public Node getChild(int i){
		
		if (childrenNodes.size() - 1 >= i) {
			return childrenNodes.get(i);
		}
		
		return null;
	}
	
	//the property of the Node
	final public NodeProp getNodeProp(){
		return mNodeProp;
	}
}

NodeProp类,定义了每个节点具体的属性,和对这些属性的操作方法。

public class NodeProp {
	//default property
	final static int DEFAULT_ID = -1;

	
	private int id = DEFAULT_ID;
	
	public void setId(int id){
		this.id = id;
	}
	
	public int getId(){
		return this.id;
	}

	//search property
	public boolean SearchId(int id) {
		
		if (id == DEFAULT_ID) return false;
		
		System.out.println("this.id = " + this.id);
		System.out.println("id = " + id);
		return (id == this.id);
	}
	
}

Tree类,实现树型数据结构,负责增删改查节点。

public class Tree {
	Node root = null;
	
	public Tree(){}
	
	 public void addNode(Node parent, Node newNode){
	        //增加根节点
	        if(null == parent){
	            if(null == root){
	                root = newNode;
	            }
	        }else{
	        	parent.addChild(newNode);
	        }
	 }
	 
	    /*    通过ID查找节点 */
	 	public Node searchId(int id){
	    	return searchId(root, id);
	    }
	 	
	    public Node searchId(Node node, int id){
	    	
	    	if (node == null) return null;	
	    	
	    	if (node.getNodeProp().SearchId(id)) {
				return node;
			}else {
				for (int i = 0; i < node.getChildrenSize(); i++) {
					searchId(node.getChild(i), id);
				}
			}
			
	        return null;
	    }
	    
	    public Node getRoot(){
	    	return root;
	    }
}