Skip to content

Rough Book

random musings

Menu
  • About Me
  • Contact
  • Projects
    • bAdkOde
    • CherryBlossom
    • FXCalendar
    • Sulekha
Menu

Generic (n-ary) Tree in Java

Posted on January 30, 2010May 25, 2011 by vivin

After writing a class for a Generic Tree Node, we need to write a Generic Tree class, which will use Generic Tree Nodes to build a Generic Tree:

GenericTreeTraversalOrderEnum.java
[sourcecode lang="java"]
public enum GenericTreeTraversalOrderEnum {
PRE_ORDER,
POST_ORDER
}
[/sourcecode]

GenericTree.java
[sourcecode lang="java"]
import java.util.*;

public class GenericTree {

private GenericTreeNode root;

public GenericTree() {
super();
}

public GenericTreeNode getRoot() {
return this.root;
}

public void setRoot(GenericTreeNode root) {
this.root = root;
}

public int getNumberOfNodes() {
int numberOfNodes = 0;

if(root != null) {
numberOfNodes = auxiliaryGetNumberOfNodes(root) + 1; //1 for the root!
}

return numberOfNodes;
}

private int auxiliaryGetNumberOfNodes(GenericTreeNode node) {
int numberOfNodes = node.getNumberOfChildren();

for(GenericTreeNode child : node.getChildren()) {
numberOfNodes += auxiliaryGetNumberOfNodes(child);
}

return numberOfNodes;
}

public boolean exists(GenericTreeNode nodeToFind) {
return (find(nodeToFind) != null);
}

public GenericTreeNode find(GenericTreeNode nodeToFind) {
GenericTreeNode returnNode = null;

if(root != null) {
returnNode = auxiliaryFind(root, nodeToFind);
}

return returnNode;
}

private GenericTreeNode auxiliaryFind(GenericTreeNode currentNode, GenericTreeNode nodeToFind) {
GenericTreeNode returnNode = null;
int i = 0;

if (currentNode.equals(nodeToFind)) {
returnNode = currentNode;
}

else if(currentNode.hasChildren()) {
i = 0;
while(returnNode == null && i < currentNode.getNumberOfChildren()) { returnNode = auxiliaryFind(currentNode.getChildAt(i), nodeToFind); i++; } } return returnNode; } public boolean isEmpty() { return (root == null); } public List> build(GenericTreeTraversalOrderEnum traversalOrder) {
List> returnList = null;

if(root != null) {
returnList = build(root, traversalOrder);
}

return returnList;
}

public List> build(GenericTreeNode node, GenericTreeTraversalOrderEnum traversalOrder) {
List> traversalResult = new ArrayList>();

if(traversalOrder == GenericTreeTraversalOrderEnum.PRE_ORDER) {
buildPreOrder(node, traversalResult);
}

else if(traversalOrder == GenericTreeTraversalOrderEnum.POST_ORDER) {
buildPostOrder(node, traversalResult);
}

return traversalResult;
}

private void buildPreOrder(GenericTreeNode node, List> traversalResult) {
traversalResult.add(node);

for(GenericTreeNode child : node.getChildren()) {
buildPreOrder(child, traversalResult);
}
}

private void buildPostOrder(GenericTreeNode node, List> traversalResult) {
for(GenericTreeNode child : node.getChildren()) {
buildPostOrder(child, traversalResult);
}

traversalResult.add(node);
}

public Map, Integer> buildWithDepth(GenericTreeTraversalOrderEnum traversalOrder) {
Map, Integer> returnMap = null;

if(root != null) {
returnMap = buildWithDepth(root, traversalOrder);
}

return returnMap;
}

public Map, Integer> buildWithDepth(GenericTreeNode node, GenericTreeTraversalOrderEnum traversalOrder) {
Map, Integer> traversalResult = new LinkedHashMap, Integer>();

if(traversalOrder == GenericTreeTraversalOrderEnum.PRE_ORDER) {
buildPreOrderWithDepth(node, traversalResult, 0);
}

else if(traversalOrder == GenericTreeTraversalOrderEnum.POST_ORDER) {
buildPostOrderWithDepth(node, traversalResult, 0);
}

return traversalResult;
}

private void buildPreOrderWithDepth(GenericTreeNode node, Map, Integer> traversalResult, int depth) {
traversalResult.put(node, depth);

for(GenericTreeNode child : node.getChildren()) {
buildPreOrderWithDepth(child, traversalResult, depth + 1);
}
}

private void buildPostOrderWithDepth(GenericTreeNode node, Map, Integer> traversalResult, int depth) {
for(GenericTreeNode child : node.getChildren()) {
buildPostOrderWithDepth(child, traversalResult, depth + 1);
}

traversalResult.put(node, depth);
}

public String toString() {
/*
We're going to assume a pre-order traversal by default
*/

String stringRepresentation = "";

if(root != null) {
stringRepresentation = build(GenericTreeTraversalOrderEnum.PRE_ORDER).toString();

}

return stringRepresentation;
}

public String toStringWithDepth() {
/*
We're going to assume a pre-order traversal by default
*/

String stringRepresentation = "";

if(root != null) {
stringRepresentation = buildWithDepth(GenericTreeTraversalOrderEnum.PRE_ORDER).toString();
}

return stringRepresentation;
}
}
[/sourcecode]

Pages: 1 2 3

55 thoughts on “Generic (n-ary) Tree in Java”

Comments navigation

Older comments
  1. Pingback: Answer: Java tree data-structure? #answer #programming #computers | IT Info
  2. max says:
    November 5, 2015 at 7:44 pm

    This looks great! Just added to my project… you’re a life saver Vivin!

    Reply
  3. SUDHARSHAN REDDY KAKUMANU says:
    June 1, 2016 at 9:49 pm

    How do we get parent of a child ?

    Reply

Comments navigation

Older comments

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Meta

  • Log in
  • Entries feed
  • Comments feed
  • WordPress.org

Archives

  • February 2023
  • April 2020
  • February 2020
  • January 2020
  • December 2019
  • November 2019
  • September 2019
  • August 2019
  • July 2019
  • June 2019
  • May 2019
  • March 2019
  • February 2019
  • January 2019
  • December 2018
  • November 2018
  • September 2018
  • August 2018
  • July 2018
  • June 2018
  • May 2018
  • April 2018
  • March 2018
  • February 2018
  • January 2018
  • December 2017
  • November 2017
  • October 2017
  • June 2017
  • March 2017
  • November 2016
  • August 2016
  • July 2016
  • June 2016
  • February 2016
  • August 2015
  • July 2014
  • June 2014
  • March 2014
  • December 2013
  • November 2013
  • September 2013
  • July 2013
  • June 2013
  • March 2013
  • February 2013
  • January 2013
  • October 2012
  • July 2012
  • June 2012
  • January 2012
  • December 2011
  • November 2011
  • October 2011
  • September 2011
  • July 2011
  • June 2011
  • May 2011
  • February 2011
  • January 2011
  • December 2010
  • November 2010
  • October 2010
  • September 2010
  • July 2010
  • June 2010
  • May 2010
  • April 2010
  • March 2010
  • January 2010
  • December 2009
  • November 2009
  • October 2009
  • September 2009
  • August 2009
  • July 2009
  • May 2009
  • April 2009
  • March 2009
  • February 2009
  • January 2009
  • December 2008
  • November 2008
  • October 2008
  • August 2008
  • March 2008
  • February 2008
  • November 2007
  • July 2007
  • June 2007
  • May 2007
  • March 2007
  • December 2006
  • October 2006
  • September 2006
  • August 2006
  • June 2006
  • April 2006
  • March 2006
  • January 2006
  • December 2005
  • November 2005
  • October 2005
  • September 2005
  • August 2005
  • July 2005
  • June 2005
  • May 2005
  • April 2005
  • February 2005
  • October 2004
  • September 2004
  • August 2004
  • July 2004
  • June 2004
  • May 2004
  • April 2004
  • March 2004
  • February 2004
  • January 2004
  • December 2003
  • November 2003
  • October 2003
  • September 2003
  • July 2003
  • June 2003
  • May 2003
  • March 2003
  • February 2003
  • January 2003
  • December 2002
  • November 2002
  • October 2002
  • September 2002
  • August 2002
  • July 2002
  • June 2002
  • May 2002
  • April 2002
  • February 2002
  • September 2001
  • August 2001
  • April 2001
  • March 2001
  • February 2001
  • January 2001
  • December 2000
  • November 2000
  • October 2000
  • August 2000
  • July 2000
  • June 2000
  • May 2000
  • March 2000
  • January 2000
  • December 1999
  • November 1999
  • October 1999
  • September 1999
©2023 Rough Book | Built using WordPress and Responsive Blogily theme by Superb
All original content on these pages is fingerprinted and certified by Digiprove