<< Chapter < Page Chapter >> Page >
Explains the binary tree structure, and gives a sample implementation in Java, along with example tree algorithms.

Up until now, we have been organizing data in a "linear" fashion: one item after another. The corresponding data structures are the immutable scheme list ( IList ) and the mutable linear recursive structure ( LRStruct ). Now, suppose we want to model something like the following organization chart.

A structure of data such as the above is called a tree . We first design a special kind of mutable tree structure called binary trees.

1. binary tree object model

Binary Tree
A (mutable) binary tree, BiTree , can be in an empty state or a non-empty state:
  • When it is empty, it contains no data.
  • When it is not empty, it contains a data object called the root element, and 2 distinct BiTree objects called the left subtree and the right subtree.

We implement the above object structure with a combination of state/composite/visitor patterns, in a manner analogous to LRStruct .

Below is the public interface of the binary tree framework. Click here for javadoc documentation.

The implementation details are given in the following UML class diagram. Click here for javadoc documentation.

2. implementation details

The code for BiTree is trivial, as it simply delegates most calls to its state, the root node. The real work is done in the state. The code for EmptyNode and DatNode for the most part are equally trivial. The insertion and removal of the root data of a BiTree require some work and need some explanation. When does it make sense to remove the root node from a (binary) tree? That is, when can one unambiguously remove the root node from a binary tree?

Clearly, when both subtrees of a root node are non-empty, then removing the root node is problematic. However, it makes sense to allow root removal when at least one of the subtrees is empty. Suppose one of the subtrees is empty, then BiTree.remRoot() will change the state of this BiTree to the state of the other subtree. For example, when the left subtree is empty, root removal of the parent tree will set the parent tree to its right subtree.

Emptynode

/** * Asks the owner tree to set the root node to a new* DatNode containing dat, * resulting in a state change from empty to non-empty.* @param dat a given data Object. * @param owner the context of this state.*/ void insertRoot(Object dat, BiTree owner) {owner.setRootNode(new DatNode(dat)); }/** * Throws java.util.NoSuchElementException.* @param owner the BiTree holding this EmptyNode. */Object remRoot (BiTree owner) { throw new NoSuchElementException ("EmptyNode.remRoot()");} /*** Calls algo's emptyCase() method to execute the algorithm algo. * @param owner the BiTree holding this EmptyNode.* @param algo an algorithm on owner. * @param inp the input algo needs.* @return the output for the emptyCase() of algo. */Object execute(BiTree owner, IVisitor algo, Object... inp) { return algo.emptyCase (owner, inp);}
EmptyNode

Datnode

/** * Stores data and represents a non-empty state.* @author Dung X. Nguyen - Copyright 2005 - All rights reserved. */class DatNode extends ANode { /*** Data Invariant: != null. */private BiTree _leftTree = new BiTree (); /*** the stored data element. */private Object _dat; /*** Data Invariant: != null. */private BiTree _rightTree = new BiTree (); /*** Throws an IllegalStateException because the owner tree is not empty. * @exception IllegaStateException.*/ void insertRoot(Object dat, BiTree owner) {throw new IllegalStateException ("DatNode.insertRoot()."); }/** * Removes and returns the root element from the owner tree by asking the* left subtree and, if necessary, the right subtree to help do the job. * The subtrees help determine whether or not the root element can be removed* by executing appropriate anonymous visitors. * @param owner the BiTree holding this DatNode. Why is it final?* @exception IllegaStateException if both subtrees of owner are non-empty. */Object remRoot(final BiTree owner) { return _leftTree.execute(new IVisitor() {/** * The left subtree is empty. The parent tree can simply become the* right subtree. */public Object emptyCase(BiTree host, Object... notUsed) { owner.setRootNode(_rightTree.getRootNode());return _dat; }/** * The left subtree is not empty! The right subtree must determine* whether or not the parent root can be removed. */public Object nonEmptyCase(BiTree host, Object... notUsed) { return _rightTree.execute(new IVisitor() {/** * At this point both the lef and right subtrees are empty.*/ public Object emptyCase(BiTree h, Object... notUsed) {owner.setRootNode(_leftTree.getRootNode()); return _dat;} /*** Both left and right subtrees are not empty! Cannot remove root. */public Object nonEmptyCase(BiTree h, Object... notUsed) { throw new IllegalStateException ("Both subtrees are non-empty");} });} });} /*** Calls algo's nonEmptyCase() method to execute the algorithm algo. * @param owner the BiTree holding this DatNode.* @param algo an algorithm on owner. * @param inp the input algo needs.* @return the output for the nonEmptyCase() of algo. */Object execute(BiTree owner, IVisitor algo, Object... inp) { return algo.nonEmptyCase (owner, inp);} }
DatNode

3. the best tree printing algorithm in texas

Consider the binary tree displayed in the following "horizontal" manner:

62 _______________|_________________| | 20 7_____|____________ ______|______ | | | |[ ] 18 [ ][ ] _________|______| | 39 [ ]_____|_____ | |[ ] [ ]

Such horizontal display of a tree is not very convenient when the tree is wide. It is more convenient to display the tree in a "vertical" manner.

The following visitor and its helper print the above tree "vertically" as shown below:

62 |_ 20| |_ [] | |_ 18| |_ 39 | | |_ []| | |_ [] | |_ []|_ 7 |_ []|_ []

Let's study the algorithm.

/** * Computes a String representation of the binary tree host so* that it can be * printed vertically.* @author Dung X. Nguyen - Copyright 2005 - All rights reserved. */public class ToString implements IVisitor {public final static ToString Singleton = new ToString ();private ToString () { }/*** Returns "[]", a String representation of an empty binary* tree. * @param host an empty binary tree.* @param nu not used. * @return String*/public Object emptyCase(BiTree host, Object... nu) {return "[]";}/** * Computes a String representation of the binary tree host* so that it can be printed vertically. There is no '\n' * at the end of the String. Passes appropriate leftmost* leading String to a * helper visitor to compute the* String representations of the left and right subtrees. * @param host a non-empty binary tree.* @param nu not used. * @return String*/public Object nonEmptyCase(BiTree host, Object... nu) { String ls= (String)host.getLeftSubTree().execute(ToStringHelp.Singleton, "| ");String rs= (String)host.getRightSubTree().execute(ToStringHelp.Singleton, " ");return (host.getRootDat() + "\n" + ls + "\n" + rs);// EXERCISE FOR STUDENTS: Rewrite using anonymous inner classes.} } /** * Computes a String representation of the binary tree host so* that it can be printed vertically, given a leftmost leading * string for the two subtrees.* Called by ToString. * Should be implemented as an anonymous inner class in the* call by ToString. * @author Dung X. Nguyen - Copyright 2005 - All rights reserved.*/ public class ToStringHelp implements IVisitor {public final static ToStringHelp Singleton = new ToStringHelp ();private ToStringHelp () {}/** * Returns "|_[]" to denote an empty tree subtree. * @param host an empty binary (sub)tree.* @param nu not used. * @return String*/public Object emptyCase(BiTree host, Object... nu) {return "|_ []";}/** * Computes a String representation of the binary tree host* so that it can be printed vertically. * There is no '\n' at the end of the String.* @param host a non-empty binary (sub)tree. * @param leftLead[0]appropriate leftmost leading String to * help compute the* String representations of the left and right subtrees. * @return String*/public Object nonEmptyCase(BiTree host, Object... leftLead) { String ls= (String)host.getLeftSubTree().execute(this,leftLead[0]+ "| "); String rs= (String)host.getRightSubTree().execute(this, leftLead[0]+ " ");return ("|_ " + host.getRootDat()+ "\n" + leftLead[0]+ ls + "\n" + leftLead[0]+ rs); }}

Questions & Answers

what is microbiology
Agebe Reply
What is a cell
Odelana Reply
what is cell
Mohammed
how does Neisseria cause meningitis
Nyibol Reply
what is microbiologist
Muhammad Reply
what is errata
Muhammad
is the branch of biology that deals with the study of microorganisms.
Ntefuni Reply
What is microbiology
Mercy Reply
studies of microbes
Louisiaste
when we takee the specimen which lumbar,spin,
Ziyad Reply
How bacteria create energy to survive?
Muhamad Reply
Bacteria doesn't produce energy they are dependent upon their substrate in case of lack of nutrients they are able to make spores which helps them to sustain in harsh environments
_Adnan
But not all bacteria make spores, l mean Eukaryotic cells have Mitochondria which acts as powerhouse for them, since bacteria don't have it, what is the substitution for it?
Muhamad
they make spores
Louisiaste
what is sporadic nd endemic, epidemic
Aminu Reply
the significance of food webs for disease transmission
Abreham
food webs brings about an infection as an individual depends on number of diseased foods or carriers dully.
Mark
explain assimilatory nitrate reduction
Esinniobiwa Reply
Assimilatory nitrate reduction is a process that occurs in some microorganisms, such as bacteria and archaea, in which nitrate (NO3-) is reduced to nitrite (NO2-), and then further reduced to ammonia (NH3).
Elkana
This process is called assimilatory nitrate reduction because the nitrogen that is produced is incorporated in the cells of microorganisms where it can be used in the synthesis of amino acids and other nitrogen products
Elkana
Examples of thermophilic organisms
Shu Reply
Give Examples of thermophilic organisms
Shu
advantages of normal Flora to the host
Micheal Reply
Prevent foreign microbes to the host
Abubakar
they provide healthier benefits to their hosts
ayesha
They are friends to host only when Host immune system is strong and become enemies when the host immune system is weakened . very bad relationship!
Mark
what is cell
faisal Reply
cell is the smallest unit of life
Fauziya
cell is the smallest unit of life
Akanni
ok
Innocent
cell is the structural and functional unit of life
Hasan
is the fundamental units of Life
Musa
what are emergency diseases
Micheal Reply
There are nothing like emergency disease but there are some common medical emergency which can occur simultaneously like Bleeding,heart attack,Breathing difficulties,severe pain heart stock.Hope you will get my point .Have a nice day ❣️
_Adnan
define infection ,prevention and control
Innocent
I think infection prevention and control is the avoidance of all things we do that gives out break of infections and promotion of health practices that promote life
Lubega
Heyy Lubega hussein where are u from?
_Adnan
en français
Adama
which site have a normal flora
ESTHER Reply
Many sites of the body have it Skin Nasal cavity Oral cavity Gastro intestinal tract
Safaa
skin
Asiina
skin,Oral,Nasal,GIt
Sadik
How can Commensal can Bacteria change into pathogen?
Sadik
How can Commensal Bacteria change into pathogen?
Sadik
all
Tesfaye
by fussion
Asiina
what are the advantages of normal Flora to the host
Micheal
what are the ways of control and prevention of nosocomial infection in the hospital
Micheal
Got questions? Join the online conversation and get instant answers!
Jobilize.com Reply

Get Jobilize Job Search Mobile App in your pocket Now!

Get it on Google Play Download on the App Store Now




Source:  OpenStax, Principles of object-oriented programming. OpenStax CNX. May 10, 2013 Download for free at http://legacy.cnx.org/content/col10213/1.37
Google Play and the Google Play logo are trademarks of Google Inc.

Notification Switch

Would you like to follow the 'Principles of object-oriented programming' conversation and receive update notifications?

Ask