2008年(35)
分类: C/C++
2008-06-01 11:30:03
#include
#include
#include
using namespace std;
/////////////////////////////////////////////////////////////
//普通二叉树结点结构
/////////////////////////////////////////////////////////////
template
struct BSTNode
{
BSTNode *left,*right;
T element;
BSTNode(BSTNode* x=0,BSTNode* y=0,T e=T())
{
left=x;
right=y;
element=e;
}
};
/////////////////////////////////////////////////////////////
//普通二叉树类
/////////////////////////////////////////////////////////////
template
class BST
{
public:
BST(){root=NULL;}
BST(BST
{
cout<<"in copy structure"<
root=new BSTNode
root->left=copyBST(head->left);
root->right=copyBST(right->right);
}
void visit(BSTNode
{
cout<
}
BSTNode
{
if(node!=NULL)
{
BSTNode
temp->left=copyBST(node->left);
temp->right=copyBST(node->right);
return temp;
}
return NULL;
}
void preorder();
void midorder();
void postorder();
BSTNode
void insert(const T& e);
BSTNode
void remove(BSTNode
void remove(const T& e);
void printData( T data, int level );
void printTree( BSTNode
void CreateNode(BSTNode
~BST(){delete root;}
void Input(istream& in);
void Output(ostream& out);
private:
BSTNode
friend ostream& operator <<(ostream& out,BSTNode
friend istream& operator >>(istream& in,BSTNode
};
/////////////////////////////////////////////////////////////
//二叉树先序遍历
/////////////////////////////////////////////////////////////
template
void BST
{
stack
BSTNode
while(!pool.empty()||head!=NULL)
{
while(head!=NULL)
{
visit(head);
pool.push(head);
head=head->left;
}
if(!pool.empty())
{
head=pool.top();
pool.pop();
head=head->right;
}
}
cout<
/////////////////////////////////////////////////////////////
//二叉树中序遍历
/////////////////////////////////////////////////////////////
template
void BST
{
stack
BSTNode
while(!pool.empty()||head!=NULL)
{
while(head!=NULL)
{
pool.push(head);
head=head->left;
}
if(!pool.empty())
{
head=pool.top();
pool.pop();
visit(head);
head=head->right;
}
}
cout<
/////////////////////////////////////////////////////////////
//二叉树后序遍历
/////////////////////////////////////////////////////////////
template
void BST
{
stack
BSTNode
BSTNode
while(head!=NULL)
{
for(;head->left!=NULL;head=head->left) //左子树入栈
{
pool.push(head);
}
while(head!=NULL&&(head->right==0||head->right==pre)) //访问左子树结点,或根结点(右子树访问完毕)
{
visit(head);
pre=head;
if(pool.empty())
return;
head=pool.top();
pool.pop();
}
pool.push(head); //压入根结点
head=head->right; //访问右子树
}
cout<
/////////////////////////////////////////////////////////////
//二叉树结点加入
/////////////////////////////////////////////////////////////
template
void BST
{
BSTNode
if(temp==NULL)
{
BSTNode
BSTNode
while(p!=0)
{
pre=p;
if(p->element
else
p=p->left;
}
if(root==0)
root=new BSTNode
else
{
if((pre->element)>e)
pre->left=new BSTNode
else
pre->right=new BSTNode
}
}
else
cout<<"node already exist"<
/////////////////////////////////////////////////////////////
//二叉树结点查找
/////////////////////////////////////////////////////////////
template
BSTNode
{
BSTNode
stack
while(p!=NULL||!s.empty())
{
while(p!=NULL)
{
if(p->element==e)
return p;
s.push(p);
p=p->left;
}
if(!s.empty())
{
p=s.top();
s.pop();
p=p->right;
}
}
return NULL;
}
/////////////////////////////////////////////////////////////
//二叉树结点删除
/////////////////////////////////////////////////////////////
template
void BST
{
BSTNode
if(node!=0)
{
if(!node->right)
{
node=node->left;
}
else if(!node->left)
{
node=node->right;
}
else
{
temp=node->right;
while(temp->left!=0)
temp=temp->left;
temp->left=node->left;
temp=node;
node=node->right;
}
delete temp;
}
}
template
void BST
{
BSTNode
BSTNode
if(node!=NULL)
{
if(pre->left==node)
remove(pre->left);
else if(pre->right==node)
remove(pre->right);
else if(root!=0)
cout<<"key "<
}
/////////////////////////////////////////////////////////////
//打印二叉树结点
/////////////////////////////////////////////////////////////
template
void BST
for( int i = 0; i < level; i++ ){
printf( " ");
}
cout<}
/////////////////////////////////////////////////////////////
//打印二叉树结构
/////////////////////////////////////////////////////////////
template
void BST
if( node == NULL ) return;
if( node->right ) {
printTree( node->right, level + 1 );
}
printData( node->element, level );
if( node->left ){
printTree( node->left, level + 1 );
}
}
/////////////////////////////////////////////////////////////
//构造二叉树
/////////////////////////////////////////////////////////////
template
void BST
{
if(node!=NULL)
{
cout<<"please input the left node of "<
in>>e;
if(e!=T())
{
BSTNode
node->left=left;
CreateNode(left,in);
}
cout<<"please input the right node of "<
if(e!=T())
{
BSTNode
node->right=right;
CreateNode(right,in);
}
}
else
{
cout<<"please input root"<
in>>e;
root=new BSTNode
CreateNode(root,in);
}
}
/////////////////////////////////////////////////////////////
//返回二叉树根结点
/////////////////////////////////////////////////////////////
template
BSTNode
{
return root;
}
/////////////////////////////////////////////////////////////
//输入二叉树
/////////////////////////////////////////////////////////////
template
void BST
{
cout<<"please input the tree node"<
}
/////////////////////////////////////////////////////////////
//输出二叉树
/////////////////////////////////////////////////////////////
template
void BST
{
out<<"the BST tree is as follows:"<
}
/////////////////////////////////////////////////////////////
//重载二叉树<<
/////////////////////////////////////////////////////////////
template
ostream& operator << (ostream& out,BST
{
node.Output(out);
return out;
}
/////////////////////////////////////////////////////////////
//重载二叉树>>
/////////////////////////////////////////////////////////////
template
istream& operator >> (istream& in,BST
{
node.Input(in);
return in;
}
int main()
{
BST
cin>>x;
cout<
}