c++二叉排序树的链式实现
2013-04-11 11:15
435 查看
二叉排序树链式实现,前序、中序、后序遍历
#include
<iostream>
#include
<iomanip>
#include
<assert.h>
using namespace
std;
////////////////////////////////////////////////////////////////////
//class TreeNode
////////////////////////////////////////////////////////////////////
template<class
NODETYPE> class
MyTree;//forward declare
template<class
NODETYPE>
class
TreeNode
{
friend
class MyTree<
NODETYPE>;
public:
TreeNode(
const NODETYPE & );
NODETYPE
getData()const;
private:
TreeNode<
NODETYPE>* leftPtr;
NODETYPE
data;
TreeNode<
NODETYPE>* rightPtr;
};
template<class
NODETYPE>
TreeNode<NODETYPE >::TreeNode(const
NODETYPE& d) :
leftPtr(0),data(d),rightPtr(0)
{
}
template<class
NODETYPE>
NODETYPE
TreeNode< NODETYPE>::getData()
const
{
return
data;
}
///////////////////////////////////////////////////////////////////
//class MyTree
///////////////////////////////////////////////////////////////////
template<class
NODETYPE>
class
MyTree
{
public:
MyTree();
void
insertNode( const
NODETYPE& );
void
preOrderTraversal()const;
//前序遍历
void
inOrderTraversal()const;//中序遍历
void
postOrderTraversal()const;//后序遍历
private:
TreeNode<
NODETYPE>* rootPtr;
//utility
void
insertNodeHelper(TreeNode<
NODETYPE>** , const
NODETYPE&);
void
preOrderHelper(TreeNode<
NODETYPE>* ) const;
void
inOrderHelper(TreeNode<
NODETYPE>* ) const;
void
postOrderHelper(TreeNode<
NODETYPE>* ) const;
};
template<class
NODETYPE>
MyTree<NODETYPE >::MyTree():
rootPtr(0)
{
}
template<class
NODETYPE>
void
MyTree< NODETYPE>::insertNode(
constNODETYPE &
d)
{
insertNodeHelper( &
ccb7
rootPtr,d );
}
template<class
NODETYPE>
void
MyTree< NODETYPE>::preOrderTraversal()
const
{
preOrderHelper(
rootPtr);
}
template<class
NODETYPE>
void
MyTree< NODETYPE>::inOrderTraversal()
const
{
inOrderHelper(
rootPtr);
}
template<class
NODETYPE>
void
MyTree< NODETYPE>::postOrderTraversal()
const
{
postOrderHelper(
rootPtr);
}
template<class
NODETYPE>
void
MyTree< NODETYPE>::insertNodeHelper(
TreeNode< NODETYPE>**
ptr, constNODETYPE &
d)
{
if( *ptr == 0 )
//root node
{
*ptr =
new TreeNode<
NODETYPE>(d);
assert( (*ptr)!= 0 );
}
else
{
if( ((*ptr)->data) <
d )
insertNodeHelper( &(*ptr)->leftPtr,
d );
else
if( (*ptr)->data>
d )
insertNodeHelper( &(*ptr)->rightPtr,
d );
else
cout <<
d<< " dup"<<endl;
}
}
template<class
NODETYPE>
void
MyTree< NODETYPE>::preOrderHelper(
TreeNode< NODETYPE>*
ptr) const
{
if(
ptr != 0 )
{
cout <<
ptr->data <<
"";
preOrderHelper(
ptr->leftPtr );
preOrderHelper(
ptr->rightPtr );
}
}
template<class
NODETYPE>
void
MyTree< NODETYPE>::inOrderHelper(
TreeNode< NODETYPE >*
ptr) const
{
if(
ptr != 0 )
{
inOrderHelper(
ptr->leftPtr );
cout <<
ptr->data <<
"";
inOrderHelper(
ptr->rightPtr );
}
}
template<class
NODETYPE>
void
MyTree< NODETYPE>::postOrderHelper(
TreeNode< NODETYPE>*
ptr ) const
{
if(
ptr != 0 )
{
postOrderHelper(
ptr->leftPtr );
postOrderHelper(
ptr->rightPtr );
cout <<
ptr->data <<
"";
}
}
int main(
void )
{
MyTree<
int> intTree;
int
intVal;
cout <<
"Enter10 integer numbers:\n";
for(
int i = 0;
i <10; ++i)
{
cin >>
intVal;
intTree.insertNode(intVal );
}
cout <<
"\npreOrdertraversal:";
intTree.preOrderTraversal();
cout <<
"\ninOrdertraversal:";
intTree.inOrderTraversal();
cout <<
"\npostOrdertraversal:";
intTree.postOrderTraversal();
cout <<
"\n\n";
return 0;
}
#include
<iostream>
#include
<iomanip>
#include
<assert.h>
using namespace
std;
////////////////////////////////////////////////////////////////////
//class TreeNode
////////////////////////////////////////////////////////////////////
template<class
NODETYPE> class
MyTree;//forward declare
template<class
NODETYPE>
class
TreeNode
{
friend
class MyTree<
NODETYPE>;
public:
TreeNode(
const NODETYPE & );
NODETYPE
getData()const;
private:
TreeNode<
NODETYPE>* leftPtr;
NODETYPE
data;
TreeNode<
NODETYPE>* rightPtr;
};
template<class
NODETYPE>
TreeNode<NODETYPE >::TreeNode(const
NODETYPE& d) :
leftPtr(0),data(d),rightPtr(0)
{
}
template<class
NODETYPE>
NODETYPE
TreeNode< NODETYPE>::getData()
const
{
return
data;
}
///////////////////////////////////////////////////////////////////
//class MyTree
///////////////////////////////////////////////////////////////////
template<class
NODETYPE>
class
MyTree
{
public:
MyTree();
void
insertNode( const
NODETYPE& );
void
preOrderTraversal()const;
//前序遍历
void
inOrderTraversal()const;//中序遍历
void
postOrderTraversal()const;//后序遍历
private:
TreeNode<
NODETYPE>* rootPtr;
//utility
void
insertNodeHelper(TreeNode<
NODETYPE>** , const
NODETYPE&);
void
preOrderHelper(TreeNode<
NODETYPE>* ) const;
void
inOrderHelper(TreeNode<
NODETYPE>* ) const;
void
postOrderHelper(TreeNode<
NODETYPE>* ) const;
};
template<class
NODETYPE>
MyTree<NODETYPE >::MyTree():
rootPtr(0)
{
}
template<class
NODETYPE>
void
MyTree< NODETYPE>::insertNode(
constNODETYPE &
d)
{
insertNodeHelper( &
ccb7
rootPtr,d );
}
template<class
NODETYPE>
void
MyTree< NODETYPE>::preOrderTraversal()
const
{
preOrderHelper(
rootPtr);
}
template<class
NODETYPE>
void
MyTree< NODETYPE>::inOrderTraversal()
const
{
inOrderHelper(
rootPtr);
}
template<class
NODETYPE>
void
MyTree< NODETYPE>::postOrderTraversal()
const
{
postOrderHelper(
rootPtr);
}
template<class
NODETYPE>
void
MyTree< NODETYPE>::insertNodeHelper(
TreeNode< NODETYPE>**
ptr, constNODETYPE &
d)
{
if( *ptr == 0 )
//root node
{
*ptr =
new TreeNode<
NODETYPE>(d);
assert( (*ptr)!= 0 );
}
else
{
if( ((*ptr)->data) <
d )
insertNodeHelper( &(*ptr)->leftPtr,
d );
else
if( (*ptr)->data>
d )
insertNodeHelper( &(*ptr)->rightPtr,
d );
else
cout <<
d<< " dup"<<endl;
}
}
template<class
NODETYPE>
void
MyTree< NODETYPE>::preOrderHelper(
TreeNode< NODETYPE>*
ptr) const
{
if(
ptr != 0 )
{
cout <<
ptr->data <<
"";
preOrderHelper(
ptr->leftPtr );
preOrderHelper(
ptr->rightPtr );
}
}
template<class
NODETYPE>
void
MyTree< NODETYPE>::inOrderHelper(
TreeNode< NODETYPE >*
ptr) const
{
if(
ptr != 0 )
{
inOrderHelper(
ptr->leftPtr );
cout <<
ptr->data <<
"";
inOrderHelper(
ptr->rightPtr );
}
}
template<class
NODETYPE>
void
MyTree< NODETYPE>::postOrderHelper(
TreeNode< NODETYPE>*
ptr ) const
{
if(
ptr != 0 )
{
postOrderHelper(
ptr->leftPtr );
postOrderHelper(
ptr->rightPtr );
cout <<
ptr->data <<
"";
}
}
int main(
void )
{
MyTree<
int> intTree;
int
intVal;
cout <<
"Enter10 integer numbers:\n";
for(
int i = 0;
i <10; ++i)
{
cin >>
intVal;
intTree.insertNode(intVal );
}
cout <<
"\npreOrdertraversal:";
intTree.preOrderTraversal();
cout <<
"\ninOrdertraversal:";
intTree.inOrderTraversal();
cout <<
"\npostOrdertraversal:";
intTree.postOrderTraversal();
cout <<
"\n\n";
return 0;
}
相关文章推荐
- 链式队列的基本操作实现c++
- 用C++模板实现线性表的链式存储的基本算法(数据结构C++版 北京科海)
- 数据结构学习之堆栈的链式存储C++实现
- 简单链式队列(C++模版技术实现)
- 解析C++的线性表链式存储设计与相关的API实现
- C++实现链式二叉树,操作包括初始化二叉树、前序遍历、中序遍历、后序遍历、层次遍历
- 数据结构之C/C++实现链式队列
- 栈的链式表示与实现(C++版)
- 数据结构之栈(链式存储)——C++模板类实现
- 二叉排序树(二叉查找树)的各种操作C++最新实现
- c/c++实现顺序循环队列和链式队列
- C++模板实现链式队列
- C++实现简单的二叉树与二叉排序树
- linkList C++简单链式链表的实现
- 二叉排序树的建立、插入、删除、查找、4种遍历 C++完整实现
- C++_template_栈的链式存储及实现
- c++实现链式表的类模板
- 链式队列C++实现
- c/c++ 数据结构-线性表(链式表示&实现&单链表定义&实现)
- C++实现循环队列和链式队列的示例