git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@24 f3b2605a-c512-4ea7-a41b-209d697bcdaa
This commit is contained in:
162
lib/poems/poemsnodelib.h
Normal file
162
lib/poems/poemsnodelib.h
Normal file
@ -0,0 +1,162 @@
|
||||
/*
|
||||
*_________________________________________________________________________*
|
||||
* POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE *
|
||||
* DESCRIPTION: SEE READ-ME *
|
||||
* FILE NAME: poemsnodelib.h *
|
||||
* AUTHORS: See Author List *
|
||||
* GRANTS: See Grants List *
|
||||
* COPYRIGHT: (C) 2005 by Authors as listed in Author's List *
|
||||
* LICENSE: Please see License Agreement *
|
||||
* DOWNLOAD: Free at www.rpi.edu/~anderk5 *
|
||||
* ADMINISTRATOR: Prof. Kurt Anderson *
|
||||
* Computational Dynamics Lab *
|
||||
* Rensselaer Polytechnic Institute *
|
||||
* 110 8th St. Troy NY 12180 *
|
||||
* CONTACT: anderk5@rpi.edu *
|
||||
*_________________________________________________________________________*/
|
||||
|
||||
#ifndef NODELIB_H
|
||||
#define NODELIB_H
|
||||
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
||||
TreeNode *GetTreeNode(int item,TreeNode *lptr = NULL,TreeNode *rptr =NULL);
|
||||
|
||||
void FreeTreeNode(TreeNode *p);
|
||||
|
||||
void Postorder(TreeNode *t, void visit(TreeNode* &t));
|
||||
|
||||
void Preorder (TreeNode *t, void visit(TreeNode* &t));
|
||||
|
||||
void CountLeaf (TreeNode *t, int& count);
|
||||
|
||||
int Depth (TreeNode *t);
|
||||
|
||||
void IndentBlanks(int num);
|
||||
|
||||
void PrintTree (TreeNode *t, int level);
|
||||
|
||||
|
||||
// ---------------- Global functions-----------------//
|
||||
|
||||
// postorder recursive scan of the nodes in a tree
|
||||
void Postorder (TreeNode *t, void visit(TreeNode* &t))
|
||||
{
|
||||
// the recursive scan terminates on a empty subtree
|
||||
if (t != NULL)
|
||||
{
|
||||
Postorder(t->Left(), visit); // descend left
|
||||
Postorder(t->Right(), visit); // descend right
|
||||
visit(t); // visit the node
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// preorder recursive scan of the nodes in a tree
|
||||
void Preorder (TreeNode *t, void visit(TreeNode* &t))
|
||||
{
|
||||
// the recursive scan terminates on a empty subtree
|
||||
if (t != NULL)
|
||||
{
|
||||
visit(t); // visit the node
|
||||
Preorder(t->Left(), visit); // descend left
|
||||
Preorder(t->Right(), visit); // descend right
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//create TreeNode object with pointer fields lptr and rptr
|
||||
// The pointers have default value NULL
|
||||
TreeNode *GetTreeNode(int item,TreeNode *lptr,TreeNode *rptr)
|
||||
{
|
||||
TreeNode *p;
|
||||
|
||||
// call new to allocate the new node
|
||||
// pass parameters lptr and rptr to the function
|
||||
p = new TreeNode(item, lptr, rptr);
|
||||
|
||||
// if insufficient memory, terminatewith an error message
|
||||
if (p == NULL)
|
||||
{
|
||||
cerr << "Memory allocation failure!\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// return the pointer to the system generated memory
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
// deallocate dynamic memory associated with the node
|
||||
|
||||
void FreeTreeNode(TreeNode *p)
|
||||
{
|
||||
delete p;
|
||||
}
|
||||
|
||||
|
||||
// the function uses the postorder scan. a visit
|
||||
// tests whether the node is a leaf node
|
||||
void CountLeaf (TreeNode *t, int& count)
|
||||
{
|
||||
//use postorder descent
|
||||
if(t !=NULL)
|
||||
{
|
||||
CountLeaf(t->Left(), count); // descend left
|
||||
CountLeaf(t->Right(), count); // descend right
|
||||
|
||||
// check if node t is a leaf node (no descendants)
|
||||
// if so, increment the variable count
|
||||
if (t->Left() == NULL && t->Right() == NULL)
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// the function uses the postorder scan. it computes the
|
||||
// depth of the left and right subtrees of a node and
|
||||
// returns the depth as 1 + max(depthLeft,depthRight).
|
||||
// the depth of an empty tree is -1
|
||||
int Depth (TreeNode *t)
|
||||
{
|
||||
int depthLeft, depthRight, depthval;
|
||||
|
||||
if (t == NULL)
|
||||
depthval = -1;
|
||||
else
|
||||
{
|
||||
depthLeft = Depth(t->Left());
|
||||
depthRight = Depth(t->Right());
|
||||
depthval = 1+(depthLeft > depthRight?depthLeft:depthRight);
|
||||
}
|
||||
return depthval;
|
||||
}
|
||||
|
||||
void IndentBlanks(int num)
|
||||
{
|
||||
// const int indentblock = 6;
|
||||
|
||||
for(int i = 0; i < num; i++)
|
||||
cout << " ";
|
||||
}
|
||||
|
||||
void PrintTree (TreeNode *t, int level)
|
||||
{
|
||||
//print tree with root t, as long as t!=NULL
|
||||
if (t != NULL)
|
||||
{
|
||||
int indentUnit = 5;
|
||||
// print right branch of tree t
|
||||
PrintTree(t->Right(),level + 1);
|
||||
// indent to current level; output node data
|
||||
IndentBlanks(indentUnit*level);
|
||||
cout << t->GetData() << endl;
|
||||
// print left branch of tree t
|
||||
PrintTree(t->Left(),level + 1);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user