基本功能
int Insert(BTree &T,int key);
void Creat(BTree &T,int *a,int n);
BTree Search(BTree T,int key);
void PostOrder(BTree T);
void LevelOrder(BTree T);
int PrintLevel(BTree T);
int CountNode(BTree T);
int Count_K(BTree T,int k);
int CountLeaf(BTree T);
int CountSingle(BTree T);
int CountDouble(BTree T);
int Depth(BTree T);
结构体定义
typedef struct BST
{
int data;
struct BST* lchild,*rchild;
}BST,*BTree;
运行代码
#include "stdafx.h"
#include<iostream>
#include<queue>
using namespace std;
typedef struct BST
{
int data;
struct BST* lchild,*rchild;
}BST,*BTree;
int Insert(BTree &T,int key);
void Creat(BTree &T,int *a,int n);
BTree Search(BTree T,int key);
void PostOrder(BTree T);
void LevelOrder(BTree T);
int PrintLevel(BTree T);
int CountNode(BTree T);
int Count_K(BTree T,int k);
int CountLeaf(BTree T);
int CountSingle(BTree T);
int CountDouble(BTree T);
int Depth(BTree T);
void Test();
int _tmain(int argc, _TCHAR* argv[])
{
Test();
system("pause");
return 0;
}
int Insert(BTree &T,int key)
{
if(T==NULL)
{
T=new BST;
T->data=key;
T->lchild=T->rchild=NULL;
return 1;
}
else if(T->data==key)
return 0;
else if(key < T->data)
return Insert(T->lchild,key);
else
return Insert(T->rchild,key);
}
void Creat(BTree &T,int *a,int n)
{
T=NULL;
for (int i = 0; i < n; i++)
{
Insert(T,a[i]);
}
}
BTree Search(BTree T,int key)
{
while(T!=NULL&&T->data!=key)
{
if(key < T->data)
T=T->lchild;
else
T=T->rchild;
}
return T;
}
void PostOrder(BTree T)
{
if(T!=NULL)
{
PostOrder(T->lchild);
cout<<T->data<<" ";
PostOrder(T->rchild);
}
}
void LevelOrder(BTree T)
{
queue<BTree>q; BST* p;
q.push(T);
while(!q.empty())
{
p=q.front();
cout<<p->data<<" ";
q.pop();
if(p->lchild!=NULL)
q.push(p->lchild);
if(p->rchild!=NULL)
q.push(p->rchild);
}
}
int PrintLevel(BTree T)
{
if(T==NULL)
return 0;
queue<BTree> q;BST* p;
int current;
int next;
q.push(T);
current=1;next=0;
while(!q.empty())
{
p=q.front();
cout<<p->data<<" ";
q.pop();
current--;
if(p->lchild!=NULL)
{
q.push(p->lchild);
next++;
}
if(p->rchild!=NULL)
{
q.push(p->rchild);
next++;
}
if(current==0)
{
cout<<endl;
current=next;
next=0;
}
}
}
int CountNode(BTree T)
{
if(T==NULL)
return 0;
else
return CountNode(T->lchild)+CountNode(T->rchild)+1;
}
int Count_K(BTree T,int k)
{
if(T==NULL)
return 0;
if(k==1)
return 1;
else
return Count_K(T->lchild,k-1)+Count_K(T->rchild,k-1);
}
int CountLeaf(BTree T)
{
if(T==NULL)
return 0;
else if(T->lchild==NULL&&T->rchild==NULL)
return 1;
else
return CountLeaf(T->lchild)+CountLeaf(T->rchild);
}
int CountSingle(BTree T)
{
if(T==NULL)
return 0;
else if((T->lchild==NULL&&T->rchild!=NULL)||T->rchild==NULL&&T->lchild!=NULL)
return CountSingle(T->rchild)+CountSingle(T->lchild)+1;
else
return CountSingle(T->rchild)+CountSingle(T->lchild);
}
int CountDouble(BTree T)
{
if(T==NULL)
return 0;
else if(T->lchild!=NULL&&T->rchild!=NULL)
return CountDouble(T->rchild)+CountDouble(T->lchild)+1;
else
return CountDouble(T->rchild)+CountDouble(T->lchild);
}
int Depth(BTree T)
{
if(T==NULL)
return 0;
else
return max(Depth(T->lchild),Depth(T->rchild))+1;
}
void Test()
{
BST* p;
int a[5]={4,2,5,1,6};
Creat(p,a,5);
cout<<"中序遍历"<<endl;
PostOrder(p);
int x;
cout<<endl<<"插入一个数:"<<endl;
cin>>x;
Insert(p,x);
PostOrder(p);
cout<<endl<<"层次遍历"<<endl;
LevelOrder(p);
cout<<endl<<"每层节点"<<endl;
PrintLevel(p);
cout<<"每层节点个数"<<endl;
for(int i=1;i<=Depth(p);i++)
cout<<i<<"层: "<<Count_K(p,i)<<endl;
cout<<"节点个数"<<endl;
cout<<CountNode(p);
cout<<endl<<"叶子节点个数"<<endl;
cout<<CountLeaf(p);
cout<<endl<<"单分支节点个数"<<endl;
cout<<CountSingle(p);
cout<<endl<<"双分支节点个数"<<endl;
cout<<CountDouble(p);
cout<<endl<<"树的深度"<<endl;
cout<<Depth(p);
int n;
cout<<endl<<"输入需要查询的数:";
cin>>n;
if(Search(p,n)!=NULL)
cout<<"查询成功!"<<endl;
else
cout<<"查找成功!"<<endl;
}
运行结果