您的位置:首页 > 编程语言 > Java开发

Java 多叉树的实现,完成树的初始化和遍历

2013-10-25 11:00 351 查看
Java 多叉树的实现,完成树的初始化和遍历。包括两个文件(TreeNode.java和TreeHelper.java)

TreeNode类完成树节点的数据结构,TreeHelper类通过输入一个TreeNode列表,生成一颗有一个树根的树!其它函数接口自己看看就明白了,希望对你有帮助。

一:树节点的定义(TreeNode.java)

Java代码


package com.tree;

import java.util.List;

import java.util.ArrayList;

import java.io.Serializable;

public class TreeNode implements Serializable {

private int parentId;

private int selfId;

protected String nodeName;

protected Object obj;

protected TreeNode parentNode;

protected List<TreeNode> childList;

public TreeNode() {

initChildList();

}

public TreeNode(TreeNode parentNode) {

this.getParentNode();

initChildList();

}

public boolean isLeaf() {

if (childList == null) {

return true;

} else {

if (childList.isEmpty()) {

return true;

} else {

return false;

}

}

}

/* 插入一个child节点到当前节点中 */

public void addChildNode(TreeNode treeNode) {

initChildList();

childList.add(treeNode);

}

public void initChildList() {

if (childList == null)

childList = new ArrayList<TreeNode>();

}

public boolean isValidTree() {

return true;

}

/* 返回当前节点的父辈节点集合 */

public List<TreeNode> getElders() {

List<TreeNode> elderList = new ArrayList<TreeNode>();

TreeNode parentNode = this.getParentNode();

if (parentNode == null) {

return elderList;

} else {

elderList.add(parentNode);

elderList.addAll(parentNode.getElders());

return elderList;

}

}

/* 返回当前节点的晚辈集合 */

public List<TreeNode> getJuniors() {

List<TreeNode> juniorList = new ArrayList<TreeNode>();

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());

}

return juniorList;

}

}

/* 返回当前节点的孩子集合 */

public List<TreeNode> getChildList() {

return childList;

}

/* 删除节点和它下面的晚辈 */

public void deleteNode() {

TreeNode parentNode = this.getParentNode();

int id = this.getSelfId();

if (parentNode != null) {

parentNode.deleteChildNode(id);

}

}

/* 删除当前节点的某个子节点 */

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;

}

}

}

/* 动态的插入一个新的节点到当前树中 */

public boolean insertJuniorNode(TreeNode treeNode) {

int juniorParentId = treeNode.getParentId();

if (this.parentId == juniorParentId) {

addChildNode(treeNode);

return true;

} else {

List<TreeNode> childList = this.getChildList();

int childNumber = childList.size();

boolean insertFlag;

for (int i = 0; i < childNumber; i++) {

TreeNode childNode = childList.get(i);

insertFlag = childNode.insertJuniorNode(treeNode);

if (insertFlag == true)

return true;

}

return false;

}

}

/* 找到一颗树中某个节点 */

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;

}

}

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();

}

}

public void print(String content) {

System.out.println(content);

}

public void print(int content) {

System.out.println(String.valueOf(content));

}

public void setChildList(List<TreeNode> childList) {

this.childList = childList;

}

public int getParentId() {

return parentId;

}

public void setParentId(int parentId) {

this.parentId = parentId;

}

public int getSelfId() {

return selfId;

}

public void setSelfId(int selfId) {

this.selfId = selfId;

}

public TreeNode getParentNode() {

return parentNode;

}

public void setParentNode(TreeNode parentNode) {

this.parentNode = parentNode;

}

public String getNodeName() {

return nodeName;

}

public void setNodeName(String nodeName) {

this.nodeName = nodeName;

}

public Object getObj() {

return obj;

}

public void setObj(Object obj) {

this.obj = obj;

}

}

二:TreeHelper.java

Java代码


package com.tree;

import java.util.List;

import java.util.Iterator;

import java.util.ArrayList;

import java.util.HashMap;

public class TreeHelper {

private TreeNode root;

private List<TreeNode> tempNodeList;

private boolean isValidTree = true;

public TreeHelper() {

}

public TreeHelper(List<TreeNode> treeNodeList) {

tempNodeList = treeNodeList;

generateTree();

}

public static TreeNode getTreeNodeById(TreeNode tree, int id) {

if (tree == null)

return null;

TreeNode treeNode = tree.findTreeNodeById(id);

return treeNode;

}

/** generate a tree from the given treeNode or entity list */

public void generateTree() {

HashMap nodeMap = putNodesIntoMap();

putChildIntoParent(nodeMap);

}

/**

* put all the treeNodes into a hash table by its id as the key

*

* @return hashmap that contains the treenodes

*/

protected HashMap putNodesIntoMap() {

int maxId = Integer.MAX_VALUE;

HashMap nodeMap = new HashMap<String, TreeNode>();

Iterator it = tempNodeList.iterator();

while (it.hasNext()) {

TreeNode treeNode = (TreeNode) it.next();

int id = treeNode.getSelfId();

if (id < maxId) {

maxId = id;

this.root = treeNode;

}

String keyId = String.valueOf(id);

nodeMap.put(keyId, treeNode);

// System.out.println("keyId: " +keyId);

}

return nodeMap;

}

/**

* set the parent nodes point to the child nodes

*

* @param nodeMap

* a hashmap that contains all the treenodes by its id as the key

*/

protected void putChildIntoParent(HashMap nodeMap) {

Iterator it = nodeMap.values().iterator();

while (it.hasNext()) {

TreeNode treeNode = (TreeNode) it.next();

int parentId = treeNode.getParentId();

String parentKeyId = String.valueOf(parentId);

if (nodeMap.containsKey(parentKeyId)) {

TreeNode parentNode = (TreeNode) nodeMap.get(parentKeyId);

if (parentNode == null) {

this.isValidTree = false;

return;

} else {

parentNode.addChildNode(treeNode);

// System.out.println("childId: " +treeNode.getSelfId()+" parentId: "+parentNode.getSelfId());

}

}

}

}

/** initialize the tempNodeList property */

protected void initTempNodeList() {

if (this.tempNodeList == null) {

this.tempNodeList = new ArrayList<TreeNode>();

}

}

/** add a tree node to the tempNodeList */

public void addTreeNode(TreeNode treeNode) {

initTempNodeList();

this.tempNodeList.add(treeNode);

}

/**

* insert a tree node to the tree generated already

*

* @return show the insert operation is ok or not

*/

public boolean insertTreeNode(TreeNode treeNode) {

boolean insertFlag = root.insertJuniorNode(treeNode);

return insertFlag;

}

/**

* adapt the entities to the corresponding treeNode

*

* @param entityList

* list that contains the entities

*@return the list containg the corresponding treeNodes of the entities

*/

public static List<TreeNode> changeEnititiesToTreeNodes(List entityList) {

OrganizationEntity orgEntity = new OrganizationEntity();

List<TreeNode> tempNodeList = new ArrayList<TreeNode>();

TreeNode treeNode;

Iterator it = entityList.iterator();

while (it.hasNext()) {

orgEntity = (OrganizationEntity) it.next();

treeNode = new TreeNode();

treeNode.setObj(orgEntity);

treeNode.setParentId(orgEntity.getParentId());

treeNode.setSelfId(orgEntity.getOrgId());

treeNode.setNodeName(orgEntity.getOrgName());

tempNodeList.add(treeNode);

}

return tempNodeList;

}

public boolean isValidTree() {

return this.isValidTree;

}

public TreeNode getRoot() {

return root;

}

public void setRoot(TreeNode root) {

this.root = root;

}

public List<TreeNode> getTempNodeList() {

return tempNodeList;

}

public void setTempNodeList(List<TreeNode> tempNodeList) {

this.tempNodeList = tempNodeList;

}

}

三 实体OrganizationEntity

Java代码


package com.tree;

public class OrganizationEntity {

public int parentId;

public int orgId;

public String orgName;

public int getParentId() {

return parentId;

}

public void setParentId(int parentId) {

this.parentId = parentId;

}

public int getOrgId() {

return orgId;

}

public void setOrgId(int orgId) {

this.orgId = orgId;

}

public String getOrgName() {

return orgName;

}

public void setOrgName(String orgName) {

this.orgName = orgName;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: