#ifndef TREENODE_H
#define TREENODE_H

template
<class NODETYPE> class Tree;

template
<class NODETYPE>
class TreeNode{
friend
class Tree<NODETYPE>;
public:
TreeNode(
const NODETYPE &d)
:leftPtr(
0),data(d),rightPtr(0){}
NODETYPE getdata()
const {return data;}
private:
TreeNode
<NODETYPE>*leftPtr;
NODETYPE data;
TreeNode
<NODETYPE>*rightPtr;
};
#endif

 

#ifndef TREE_H
#define TREE_H

#include
<iostream>
#include
<cassert>
#include
"treenode.h"

using std::endl;
using std::cout;
template
<class NODETYPE>
class Tree{
public:
Tree();
void insertNode(const NODETYPE&);
void preOrderTraversal() const;
void inOrderTraversal() const;
void postOrderTraversal() const;
private:
TreeNode
<NODETYPE> *rootPtr;
void insertNodeHelper(
TreeNode
<NODETYPE>**,const NODETYPE&);
void preOrderHelper(TreeNode<NODETYPE>*)const;
void inOrderHelper(TreeNode<NODETYPE>*)const;
void postOrderHelper(TreeNode<NODETYPE>*)const;

};
template
<class NODETYPE>
Tree
<NODETYPE>::Tree(){rootPtr=0;}

template
<class NODETYPE>
void Tree<NODETYPE>::insertNode(const NODETYPE&value)
{insertNodeHelper(
&rootPtr,value);}

template
<class NODETYPE>
void Tree<NODETYPE>::insertNodeHelper(
TreeNode
<NODETYPE>**ptr,const NODETYPE&value)
{
if (*ptr==0){
*ptr=new TreeNode<NODETYPE>(value);
assert(
*ptr!=0);
}
else
if (value<(*ptr)->data)
insertNodeHelper(
&((*ptr)->leftPtr),value);


if (value>(*ptr)->data)
insertNodeHelper(
&((*ptr)->rightPtr),value);
else
cout
<<value<<"dup"<<endl;
}

template
<class NODETYPE>
void Tree<NODETYPE>::preOrderTraversal() const
{preOrderHelper(rootPtr);}

template
<class NODETYPE>
void Tree<NODETYPE>::preOrderHelper(
TreeNode
<NODETYPE>*ptr) const
{
if (ptr!=0) {
preOrderHelper(ptr
->leftPtr);
cout
<<ptr->data<<' ';

preOrderHelper(ptr
->rightPtr);
}
}

template
<class NODETYPE>
void Tree<NODETYPE>::inOrderTraversal()const
{
inOrderHelper(rootPtr);}


template
<class NODETYPE>
void Tree<NODETYPE>::inOrderHelper(
TreeNode
<NODETYPE>*ptr) const
{
if (ptr!=0){
inOrderHelper(ptr
->leftPtr);
cout
<<ptr->data<<' ';
inOrderHelper(ptr
->rightPtr);
}
}

template
<class NODETYPE>
void Tree<NODETYPE>::postOrderTraversal() const
{postOrderHelper(rootPtr);}


template
<class NODETYPE>
void Tree<NODETYPE>::postOrderHelper(
TreeNode
<NODETYPE> *ptr) const
{
if (ptr!=0){
postOrderHelper(ptr
->leftPtr);
postOrderHelper(ptr
->rightPtr);
}
}
#endif




 

#include <iostream>
#include
<iomanip>
#include
"tree.h"
using std::cout;
using std::cin;
using std::setiosflags;
using std::ios;
using std::setprecision;

int main()
{
Tree
<int> intTree;
int intVal,i;
cout
<<"enter 10 integer values:\n";
for (i=0;i<10;i++){
cin
>>intVal;
intTree.insertNode(intVal);
}
cout
<<"\npreorder traversal\n";
intTree.preOrderTraversal();
cout
<<"\nInorder traversal\n";
intTree.inOrderTraversal();
cout
<<"\nPostorder traversal\n";
intTree.postOrderTraversal();

Tree
<double> doubleTree;
double doubleVal;
cout
<<"\n\n\nenter 10 double values:\n"
<<setiosflags(ios::fixed|ios::showpoint)
<<setprecision(1);
for (i=0;i<10;i++){
cin
>>doubleVal;
doubleTree.insertNode(doubleVal);
}
cout
<<"\nPreorder traversal\n";
doubleTree.preOrderTraversal();

cout
<<"\nINorder traversal\n";
doubleTree.inOrderTraversal();

cout
<<"\nPostorder traversal\n";
doubleTree.postOrderTraversal();
return 0;
}

 

posted on 2010-05-12 04:45  c++我们一起学习  阅读(175)  评论(0编辑  收藏  举报