针对树型数据结构,用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; } }