package parser.utils.tree; import java.io.Serializable; import java.util.ArrayList; import java.util.List; public class TreeNode implements Serializable { /** * 节点名 */ protected String nodeName; /** * 存放的对象 */ protected Object obj; /** * 父节点 */ protected TreeNode parentNode; /** * 孩子节点列表 */ protected List<TreeNode> childList; /** * 父节点ID */ private int parentId; /** * 自己的ID */ private int selfId; public TreeNode() { initChildList(); } public TreeNode(TreeNode parentNode) { this.getParentNode(); initChildList(); } public TreeNode(String method) { this.getParentNode(); initChildList(); nodeName = method; } /** * 是否叶子节点 * * @return true 叶子节点;false 则非叶子节点. */ public boolean isLeaf() { if (childList == null) { return true; } else { if (childList.isEmpty()) { return true; } else { return false; } } } /** * 插入一个孩子节点到当前节点中 * * @param treeNode 孩子节点 */ public void addChildNode(TreeNode treeNode) { initChildList(); childList.add(treeNode); } /** * 插入多个孩子节点到当前节点中 * */ public void addChildNodeList(ArrayList<TreeNode> treeNodes) { initChildList(); for (TreeNode treeNode : treeNodes) { childList.add(treeNode); } } /** * 初始化孩子节点列表 */ public void initChildList() { if (childList == null) { childList = new ArrayList<>(); } } /** * 是否有效树 [暂时没用] * * @return true 是 */ public boolean isValidTree() { return true; } /** * 返回当前节点的所有父辈节点集合 * * @return 所有父辈节点的列表 */ public List<TreeNode> getElders() { List<TreeNode> elderList = new ArrayList<>(); TreeNode parentNode = this.getParentNode(); if (parentNode == null) { return elderList; } else { elderList.add(parentNode); elderList.addAll(parentNode.getElders()); return elderList; } } /** * 返回当前节点的晚辈集合 * * @return 节点列表 */ public List<TreeNode> getJuniors() { List<TreeNode> juniorList = new ArrayList<>(); List<TreeNode> childList = this.getChildList(); if (childList == null) { return juniorList; } else { // int childNumber = childList.size(); // for (int i = 0; i < childNumber; i++) { // TreeNode junior = childList.get(i); // juniorList.add(junior); // juniorList.addAll(junior.getJuniors()); // } for (TreeNode junior : childList) { juniorList.add(junior); juniorList.addAll(junior.getJuniors()); } return juniorList; } } /** * 返回当前节点的孩子集合 * * @return 孩子节点列表 */ public List<TreeNode> getChildList() { return childList; } /** * 设置孩子节点类别 * * @param childList 孩子节点列表 */ public void setChildList(List<TreeNode> childList) { this.childList = childList; } /** * 删除节点和它下面的晚辈 */ public void deleteNode() { TreeNode parentNode = this.getParentNode(); int id = this.getSelfId(); if (parentNode != null) { parentNode.deleteChildNode(id); } } /** * 删除当前节点的某个子节点 * * @param childId */ public void deleteChildNode(int childId) { List<TreeNode> childList = this.getChildList(); int childNumber = childList.size(); for (int i = 0; i < childNumber; i++) { TreeNode child = childList.get(i); if (child.getSelfId() == childId) { childList.remove(i); return; } } } /** * 动态的插入一个新的节点到当前树中 * * @param treeNode 节点 * @return true 插入成功; false 失败. */ public boolean insertJuniorNode(TreeNode treeNode) { int juniorParentId = treeNode.getParentId(); if (this.parentId == juniorParentId) { addChildNode(treeNode); return true; } else { List<TreeNode> childList = this.getChildList(); boolean insertFlag; // int childNumber = childList.size(); // for (int i = 0; i < childNumber; i++) { // TreeNode childNode = childList.get(i); // insertFlag = childNode.insertJuniorNode(treeNode); // if (insertFlag == true) // return true; // } for (TreeNode childNode : childList) { insertFlag = childNode.insertJuniorNode(treeNode); if (insertFlag) return true; } return false; } } /** * 找到一颗树中某个节点 * * @param id 节点id * @return 节点 */ public TreeNode findTreeNodeById(int id) { if (this.selfId == id) return this; if (childList.isEmpty() || childList == null) { return null; } else { // int childNumber = childList.size(); // for (int i = 0; i < childNumber; i++) { // TreeNode child = childList.get(i); // TreeNode resultNode = child.findTreeNodeById(id); // if (resultNode != null) { // return resultNode; // } // } for (TreeNode child : childList) { TreeNode resultNode = child.findTreeNodeById(id); if (resultNode != null) { return resultNode; } } return null; } } /** * 遍历一棵树,层次遍历 */ public void traverse() { if (selfId < 0) return; print(this.selfId); if (childList == null || childList.isEmpty()) { return; } // int childNumber = childList.size(); // for (int i = 0; i < childNumber; i++) { // TreeNode child = childList.get(i); // child.traverse(); // } for (TreeNode child : childList) { child.traverse(); } } /** * 打印内容 * * @param content 内容 */ public void print(String content) { System.out.println(content); } /** * 打印内容 * * @param content 内容 */ public void print(int content) { System.out.println(String.valueOf(content)); } /** * 获得父节点ID * * @return id */ public int getParentId() { return parentId; } /** * 设置父节点ID * * @param parentId 父节点ID */ public void setParentId(int parentId) { this.parentId = parentId; } /** * 获得当前节点ID * * @return ID */ public int getSelfId() { return selfId; } /** * 设置当前节点ID * * @param selfId ID */ public void setSelfId(int selfId) { this.selfId = selfId; } /** * 获得父节点 * * @return 父节点 */ public TreeNode getParentNode() { return parentNode; } /** * 设置父节点 * * @param parentNode 父节点 */ public void setParentNode(TreeNode parentNode) { this.parentNode = parentNode; } /** * 获得节点名 * * @return 节点名 */ public String getNodeName() { return nodeName; } /** * 设置节点名 * * @param nodeName 节点名 */ public void setNodeName(String nodeName) { this.nodeName = nodeName; } /** * 获得存储对象 * * @return */ public Object getObj() { return obj; } /** * 设置存储对象 * * @param obj 对象 */ public void setObj(Object obj) { this.obj = obj; } }