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