65,210
社区成员
发帖
与我相关
我的任务
分享
//这个是二叉排序树
#ifndef BINARY_TREE_H
#define BINARY_TREE_H
template <class TreeElem>
class BinaryTree
{
public:
BinaryTree();
bool Insert(const TreeElem& t);
bool Search(const TreeElem& t);
void Display() const;
~BinaryTree();
private:
struct treenode
{
TreeElem info;
struct treenode *lchild;
struct treenode *rchild;
};
treenode *root;
bool Insert(treenode *&aroot,const TreeElem &t);
bool Search(treenode *&aroot,const TreeElem &t);
void Display(treenode *aroot) const;
};
#endif
#include "binarytree.h"
#include <iostream>
using namespace std;
template <class TreeElem>
BinaryTree<TreeElem>::BinaryTree():root(NULL){}
template <class TreeElem>
bool BinaryTree<TreeElem>::Insert(const TreeElem &t)
{
return Insert(root,t);
}
template <class TreeElem>
bool BinaryTree<TreeElem>::Insert(treenode *&aroot,const TreeElem &t)
{
if(aroot==NULL)
{
aroot=new treenode; //建立根节点
aroot->lchild=NULL; //左子树为空
aroot->rchild=NULL; //右子树为空
aroot->info=t;
return true;
}
else
if(aroot->info==t)
return false;
else
if(aroot->info > t)
return Insert(aroot->lchild,t);
else
return Insert(aroot->rchild,t);
}
template <class TreeElem>
bool BinaryTree<TreeElem>::Search(const TreeElem &t)
{
return Search(root,t);
}
template <class TreeElem>
bool BinaryTree<TreeElem>::Search(treenode *&aroot,const TreeElem &t)
{
if(aroot==NULL)
return false;
else
{
if(aroot->info==t)
return true;
else
if(aroot->info>t) //从左子树中查找
return Search(aroot->lchild,t);
else //从右子树中查找
return Search(aroot->rchild,t);
}
}
template <class TreeElem>
void BinaryTree<TreeElem>::Display() const
{
Display(root);
}
template <class TreeElem>
void BinaryTree<TreeElem>::Display(treenode *aroot) const
{
if(aroot!=NULL)
{
Display(aroot->lchild);
cout<<aroot->info<<" ";
Display(aroot->rchild);
}
}
template <class TreeElem>
BinaryTree<TreeElem>::~BinaryTree(){ }
#include "binarytree.cpp"
#include <iostream>
using namespace std;
int main()
{
BinaryTree<int> Bint;
int ival;
bool flag;
int a[]={2,6,9,8,12,11,23,56};
for(int i=0;i!=sizeof(a)/sizeof(int);++i)
Bint.Insert(a[i]);
Bint.Display();
cout<<"\n请输入查找的值: ";
cin>>ival;
flag=Bint.Search(ival);
if(flag)
cout<<"查找成功!"<<endl;
else
cout<<"查找失败!"<<endl;
cout<<endl;
return 0;
}
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef int TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode,*BiTree;
void InitBiTree(BiTree &T)
{
T=NULL;
}
void InsertBiTNode(BiTree &T,TElemType e) //插入节点
{
if(T==NULL)
{
T=(BiTree)malloc(sizeof(BiTNode));
T->lchild=NULL;
T->rchild=NULL;
T->data=e;
}
else
if(T->data>e)
InsertBiTNode(T->lchild,e);
else
InsertBiTNode(T->rchild,e);
}
void CreateBiTree(BiTree &T)
{
int ival;
printf("请输入数值(-1 to quit): ");
scanf("%d",&ival);
while(ival!=-1)
{
InsertBiTNode(T,ival);
scanf("%d",&ival);
}
}
void DestroyBiTree(BiTree &T) //销毁二叉树
{
return 1;
}
bool BiTreeEmpty(BiTree T) //判断二叉树是否为空
{
if(T==NULL)
return true;
else
return false;
}
BiTNode* Root(BiTree T) //返回树的根节点
{
return T;
}
void PreOrderTravese(BiTree &T) //先序遍历
{
if(T)
{
printf("%d ",T->data);
PreOrderTravese(T->lchild);
PreOrderTravese(T->rchild);
}
}
void InOrderTraverse(BiTree &T) //中跟遍历
{
if(T)
{
InOrderTraverse(T->lchild);
printf("%d ",T->data);
InOrderTraverse(T->rchild);
}
}
void PostOrdetTraverse(BiTree &T) //后序遍历
{
if(T)
{
PostOrdetTraverse(T->lchild);
PostOrdetTraverse(T->rchild);
printf("%d ",T->data);
}
}
void LevelOrderTraverse(BiTree &T) //层序遍历
{
}
//层次遍历就是按二叉树的每一层的顺序来遍历,
//也就是先访问根结果,然后访问第一层,接着访问第二层...
void main()
{
BiTree root;
InitBiTree(root);
printf("\t\t创建二叉树!\n");
CreateBiTree(root);
if(!BiTreeEmpty(root))
{
printf("\n----------前序遍历------------\n");
PreOrderTravese(root);
printf("\n----------中序遍历------------\n");
InOrderTraverse(root);
printf("\n----------后序遍历------------\n");
PostOrdetTraverse(root);
printf("\n");
}
else
printf("树为空树!\n");
system("PAUSE");
}