一,二叉树功能代码
#include<iostream>
#include<stdlib.h>
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef char TElemType;
typedef int Status;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef struct{
BiTNode *elem;
int top;
}Sqstack;
Status InitStack(Sqstack &s)
{
s.elem=new BiTNode[MAXSIZE];
if(!s.elem) return ERROR;
s.top=-1;
return OK;
}
Status Push(Sqstack &s,BiTNode *e)
{
if(s.top==MAXSIZE) return ERROR;
s.top++;
s.elem[s.top]=*e;
return OK;
}
Status Pop(Sqstack &s,BiTNode *e)
{
if(s.top==-1) return ERROR;
*e=s.elem[s.top];
s.top--;
return OK;
}
Status StackEmpty(Sqstack s)
{
if(s.top==-1)
return 1;
else
return 0;
}
void CreatBitree(BiTree &T)
{
char ch;
cin>>ch;
if(ch=='#') T=NULL;
else
{
T=new BiTNode;
T->data=ch;
CreatBitree(T->lchild);
CreatBitree(T->rchild);
}
}
//先序遍历算法
void PreorderTraverse(BiTree T)
{
if(T==NULL) return ;
cout<<T->data;
PreorderTraverse(T->lchild);
PreorderTraverse(T->rchild);
}
//中序遍历算法
void InOrderTraverse(BiTree T)
{
if(T==NULL) return ;
InOrderTraverse(T->lchild);
cout<<T->data;
InOrderTraverse(T->rchild);
}
//后序遍历算法
void PostOrderTraverse(BiTree T)
{
if(T==NULL) return ;
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data;
}
//交换左右子树
void Exchange(BiTree &T)
{
BiTNode *p;
if(T==NULL) return ;
else
{
p=T->lchild;
T->lchild=T->rchild;
T->rchild=p;
Exchange(T->lchild);
Exchange(T->rchild);
}
}
//计算二叉树结点个数
int NodeCount(BiTree T)
{
if(T==NULL) return 0;
else
return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}
//先序遍历非递归算法
void NRPreOrder(BiTree T)
{
BiTNode *p,*q;
if(T==NULL) return ;
Sqstack s;
InitStack(s);
p=T;
q=new BiTNode;
while(p||!StackEmpty(s))
{
if(p)
{
cout<<p->data;
Push(s,p);
p=p->lchild;
}
else
{
Pop(s,q);
p=q->rchild;
}
}
cout<<endl;
}
//中序遍历非递归算法
void NRInOrder(BiTree T)
{ BiTNode *p,*q;
if(T==NULL) return ;
Sqstack s;
InitStack(s);
p=T;
q=new BiTNode;
while(p||!StackEmpty(s))
{
if(p)
{
Push(s,p);
p=p->lchild;
}
else
{
Pop(s,q);
cout<<q->data;
p=q->rchild;
}
}
cout<<endl;
}
//计算二叉树叶子结点个数
int Node(BiTree T)
{ if(T==NULL) return 0;
if(T->lchild==NULL&&T->rchild==NULL)
return 1;
else
return (Node(T->lchild)+Node(T->rchild));
}
int main()
{
BiTree T;
int choice;
while(1)
{
cout<<"1,创建二叉树 2,先序递归遍历 3,中序递归遍历"<<endl;
cout<<"4,后序递归遍历 5,计算二叉树结点个数 6,计算二叉树叶子结点个数"<<endl;
cout<<"7,交换左右子树 8,先序非递归遍历 9,中序非递归遍历"<<endl;
cout<<"0, 退出"<<endl;
cout<<"输入选项:";
cin>>choice;
switch(choice)
{
case 1:
cout<<"先序输入各个结点的值:";
CreatBitree(T);
cout<<"二叉树创建完毕"<<endl;
break;
case 2:
cout<<"先序遍历:";
PreorderTraverse(T);
cout<<endl;
break;
case 3:
cout<<"中序遍历:";
InOrderTraverse(T);
cout<<endl;
break;
case 4:
cout<<"后序遍历:";
PostOrderTraverse(T);
cout<<endl;
break;
case 5:
cout<<"结点个数:";
cout<<NodeCount(T)<<endl;
break;
case 6:
cout<<"叶子结点个数:";
cout<<Node(T)<<endl;
break;
case 7:
Exchange(T);
cout<<"交换左右子树,先序遍历:";
PreorderTraverse(T);
cout<<endl;
break;
case 8:
cout<<"先序非递归遍历:";
NRPreOrder(T);
break;
case 9:
cout<<"中序非递归遍历:";
NRInOrder(T);
break;
case 0:
return 0;
break;
default:
cout<<"输入错误"<<endl;
}
system("pause");
system("cls");
}
return 0;
}
二,有疑问欢迎留言啊,之后会发布多文件版的二叉树功能函数代码。
#include<iostream>
#include<stdlib.h>
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef char TElemType;
typedef int Status;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef struct{
BiTNode *elem;
int top;
}Sqstack;
Status InitStack(Sqstack &s)
{
s.elem=new BiTNode[MAXSIZE];
if(!s.elem) return ERROR;
s.top=-1;
return OK;
}
Status Push(Sqstack &s,BiTNode *e)
{
if(s.top==MAXSIZE) return ERROR;
s.top++;
s.elem[s.top]=*e;
return OK;
}
Status Pop(Sqstack &s,BiTNode *e)
{
if(s.top==-1) return ERROR;
*e=s.elem[s.top];
s.top--;
return OK;
}
Status StackEmpty(Sqstack s)
{
if(s.top==-1)
return 1;
else
return 0;
}
void CreatBitree(BiTree &T)
{
char ch;
cin>>ch;
if(ch=='#') T=NULL;
else
{
T=new BiTNode;
T->data=ch;
CreatBitree(T->lchild);
CreatBitree(T->rchild);
}
}
//先序遍历算法
void PreorderTraverse(BiTree T)
{
if(T==NULL) return ;
cout<<T->data;
PreorderTraverse(T->lchild);
PreorderTraverse(T->rchild);
}
//中序遍历算法
void InOrderTraverse(BiTree T)
{
if(T==NULL) return ;
InOrderTraverse(T->lchild);
cout<<T->data;
InOrderTraverse(T->rchild);
}
//后序遍历算法
void PostOrderTraverse(BiTree T)
{
if(T==NULL) return ;
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data;
}
//交换左右子树
void Exchange(BiTree &T)
{
BiTNode *p;
if(T==NULL) return ;
else
{
p=T->lchild;
T->lchild=T->rchild;
T->rchild=p;
Exchange(T->lchild);
Exchange(T->rchild);
}
}
//计算二叉树结点个数
int NodeCount(BiTree T)
{
if(T==NULL) return 0;
else
return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}
//先序遍历非递归算法
void NRPreOrder(BiTree T)
{
BiTNode *p,*q;
if(T==NULL) return ;
Sqstack s;
InitStack(s);
p=T;
q=new BiTNode;
while(p||!StackEmpty(s))
{
if(p)
{
cout<<p->data;
Push(s,p);
p=p->lchild;
}
else
{
Pop(s,q);
p=q->rchild;
}
}
cout<<endl;
}
//中序遍历非递归算法
void NRInOrder(BiTree T)
{ BiTNode *p,*q;
if(T==NULL) return ;
Sqstack s;
InitStack(s);
p=T;
q=new BiTNode;
while(p||!StackEmpty(s))
{
if(p)
{
Push(s,p);
p=p->lchild;
}
else
{
Pop(s,q);
cout<<q->data;
p=q->rchild;
}
}
cout<<endl;
}
//计算二叉树叶子结点个数
int Node(BiTree T)
{ if(T==NULL) return 0;
if(T->lchild==NULL&&T->rchild==NULL)
return 1;
else
return (Node(T->lchild)+Node(T->rchild));
}
int main()
{
BiTree T;
int choice;
while(1)
{
cout<<"1,创建二叉树 2,先序递归遍历 3,中序递归遍历"<<endl;
cout<<"4,后序递归遍历 5,计算二叉树结点个数 6,计算二叉树叶子结点个数"<<endl;
cout<<"7,交换左右子树 8,先序非递归遍历 9,中序非递归遍历"<<endl;
cout<<"0, 退出"<<endl;
cout<<"输入选项:";
cin>>choice;
switch(choice)
{
case 1:
cout<<"先序输入各个结点的值:";
CreatBitree(T);
cout<<"二叉树创建完毕"<<endl;
break;
case 2:
cout<<"先序遍历:";
PreorderTraverse(T);
cout<<endl;
break;
case 3:
cout<<"中序遍历:";
InOrderTraverse(T);
cout<<endl;
break;
case 4:
cout<<"后序遍历:";
PostOrderTraverse(T);
cout<<endl;
break;
case 5:
cout<<"结点个数:";
cout<<NodeCount(T)<<endl;
break;
case 6:
cout<<"叶子结点个数:";
cout<<Node(T)<<endl;
break;
case 7:
Exchange(T);
cout<<"交换左右子树,先序遍历:";
PreorderTraverse(T);
cout<<endl;
break;
case 8:
cout<<"先序非递归遍历:";
NRPreOrder(T);
break;
case 9:
cout<<"中序非递归遍历:";
NRInOrder(T);
break;
case 0:
return 0;
break;
default:
cout<<"输入错误"<<endl;
}
system("pause");
system("cls");
}
return 0;
}