二叉树的创建
来源:互联网 发布:c语言matlab混编 编辑:程序博客网 时间:2024/05/17 03:03
/*CreateBiTree.h 创建二叉树*/
#include "commen.h"
/*根据字符串创建一个二叉树,以字符串的形式
“根 左子树 右子树” 定义一棵二叉树*/
Status CreateBiTree(BiTree &T)
{
char ch=getchar();
if(ch==' ') T=NULL;
else {
if(!(T=new BiTNode)) exit(-1);
T->data=ch;//为根结点赋值
T->lchild=T->rchild=NULL;
CreateBiTree(T->lchild);//构建左子树
CreateBiTree(T->rchild);//构建右子树
}
return TRUE;
}//CreateBiTree
/*根据前缀表达式创建二叉树*/
void CreateTree(BiTree &T)
{
char ch=getchar();
T=(BiTree)malloc(sizeof(BiTNode));
T->data=ch;
T->lchild=NULL;
T->rchild=NULL;
if(Comop(ch))//是运算符
{
CreateTree(T->lchild);
CreateTree(T->rchild);
}
}//CreateTree
/*根据后缀表达式创建二叉树*/
Status CreateTree(BiTree &T,char exp[])
{
BiTree newp,a,b;
LinkStack L;
InitStack(L);
char *p=exp;
char ch=*p;
while(ch!='#')
{
if(!(newp=(BiTree)malloc(sizeof(BiTNode))))exit(-1);
newp->data=ch;
newp->lchild=newp->rchild=NULL;
if(!Comop(ch))//不是运算符
{
Push(L,newp);//新结点进栈
}else
{
Pop(L,b);Pop(L,a);
newp->lchild=a;
newp->rchild=b;
Push(L,newp);
}
p++;
ch=*p;
}
Push(L,T);
DestroyStack(L);
return TRUE;
}//CreateTree
//先中创建二叉树PreInOd(preod,inod,1,n,1,n,root);
//n表示结点个数void PreInOd(char preod[],char inod[],int i,int j,int k,int h,BiTree &T)
{//i表示先序的起始位置,k表示中序的起始位置,j表示左子树的结点个数,h表示右子树的结点个数
//if(j<=0)T=NULL;return;
int m;//中序根结点
T=(BiTNode *)malloc(sizeof(BiTNode));
T->data=preod[i-1];//根据先序序列的第一个元素建立根结点
T->lchild=T->rchild=NULL;
m=k;
while(inod[m-1]!=preod[i-1])m++;//找到中序根结点
if(m==k) T->lchild=NULL;
else PreInOd(preod,inod,i+1,i+m-k-1,k,m-1,T->lchild);
if(m==h) T->rchild=NULL;
else PreInOd(preod,inod,i+m-k+1,j,m+1,h,T->rchild);
}//PreInOd
/*根据原表达式创建二叉树*/
Status CrtExptree(BiTree &T, char exp[] ) {
LinkStack BT;
LinkOpStack OPTR;
BiTree a,b;
InitStack(OPTR);//初始化运算符栈
InitStack(BT);//初始化结点栈
Push(OPTR,'#');
char *p=exp,c=*p,ch;
while (GetTop(OPTR,ch)&&ch!='#'||c!='#') {
if (!Comop(c)) //判断字符是否是运算符
{//不是运算符,创建结点并进栈
if(!(T=new BiTNode))exit(-1);
T->data=c;T->lchild=NULL;T->rchild=NULL;
Push(BT,T); // 建叶子结点并入栈
p++;c=*p;
}
else {//是运算符,判断优先级是否比栈顶元素高
GetTop(OPTR,ch);
switch(precede(ch,c))
{
case '<'://栈顶运算符优先权低
Push(OPTR,c);p++;c=*p;
break;
case '='://脱括号并接收下一个字符
Pop(OPTR,ch);p++;c=*p;
break;
case '>':
Pop(OPTR,ch);
Pop(BT,b); Pop(BT,a);
if(!(T=new BiTNode))exit(-1);
T->data=ch;T->rchild=b;T->lchild=a;
Push(BT,T);
// GetTop(OPTR,ch);
break;
default:
// cout<<"您输入的表达式有误!"<<endl;
p++;c=*p;
}//switch
}
}
// while
GetTop(BT,T);
DestroyStack(BT);
DestroyStack(OPTR);
return 1;
} //CrtExptree
#include "commen.h"
/*根据字符串创建一个二叉树,以字符串的形式
“根 左子树 右子树” 定义一棵二叉树*/
Status CreateBiTree(BiTree &T)
{
char ch=getchar();
if(ch==' ') T=NULL;
else {
if(!(T=new BiTNode)) exit(-1);
T->data=ch;//为根结点赋值
T->lchild=T->rchild=NULL;
CreateBiTree(T->lchild);//构建左子树
CreateBiTree(T->rchild);//构建右子树
}
return TRUE;
}//CreateBiTree
/*根据前缀表达式创建二叉树*/
void CreateTree(BiTree &T)
{
char ch=getchar();
T=(BiTree)malloc(sizeof(BiTNode));
T->data=ch;
T->lchild=NULL;
T->rchild=NULL;
if(Comop(ch))//是运算符
{
CreateTree(T->lchild);
CreateTree(T->rchild);
}
}//CreateTree
/*根据后缀表达式创建二叉树*/
Status CreateTree(BiTree &T,char exp[])
{
BiTree newp,a,b;
LinkStack L;
InitStack(L);
char *p=exp;
char ch=*p;
while(ch!='#')
{
if(!(newp=(BiTree)malloc(sizeof(BiTNode))))exit(-1);
newp->data=ch;
newp->lchild=newp->rchild=NULL;
if(!Comop(ch))//不是运算符
{
Push(L,newp);//新结点进栈
}else
{
Pop(L,b);Pop(L,a);
newp->lchild=a;
newp->rchild=b;
Push(L,newp);
}
p++;
ch=*p;
}
Push(L,T);
DestroyStack(L);
return TRUE;
}//CreateTree
//先中创建二叉树PreInOd(preod,inod,1,n,1,n,root);
//n表示结点个数void PreInOd(char preod[],char inod[],int i,int j,int k,int h,BiTree &T)
{//i表示先序的起始位置,k表示中序的起始位置,j表示左子树的结点个数,h表示右子树的结点个数
//if(j<=0)T=NULL;return;
int m;//中序根结点
T=(BiTNode *)malloc(sizeof(BiTNode));
T->data=preod[i-1];//根据先序序列的第一个元素建立根结点
T->lchild=T->rchild=NULL;
m=k;
while(inod[m-1]!=preod[i-1])m++;//找到中序根结点
if(m==k) T->lchild=NULL;
else PreInOd(preod,inod,i+1,i+m-k-1,k,m-1,T->lchild);
if(m==h) T->rchild=NULL;
else PreInOd(preod,inod,i+m-k+1,j,m+1,h,T->rchild);
}//PreInOd
/*根据原表达式创建二叉树*/
Status CrtExptree(BiTree &T, char exp[] ) {
LinkStack BT;
LinkOpStack OPTR;
BiTree a,b;
InitStack(OPTR);//初始化运算符栈
InitStack(BT);//初始化结点栈
Push(OPTR,'#');
char *p=exp,c=*p,ch;
while (GetTop(OPTR,ch)&&ch!='#'||c!='#') {
if (!Comop(c)) //判断字符是否是运算符
{//不是运算符,创建结点并进栈
if(!(T=new BiTNode))exit(-1);
T->data=c;T->lchild=NULL;T->rchild=NULL;
Push(BT,T); // 建叶子结点并入栈
p++;c=*p;
}
else {//是运算符,判断优先级是否比栈顶元素高
GetTop(OPTR,ch);
switch(precede(ch,c))
{
case '<'://栈顶运算符优先权低
Push(OPTR,c);p++;c=*p;
break;
case '='://脱括号并接收下一个字符
Pop(OPTR,ch);p++;c=*p;
break;
case '>':
Pop(OPTR,ch);
Pop(BT,b); Pop(BT,a);
if(!(T=new BiTNode))exit(-1);
T->data=ch;T->rchild=b;T->lchild=a;
Push(BT,T);
// GetTop(OPTR,ch);
break;
default:
// cout<<"您输入的表达式有误!"<<endl;
p++;c=*p;
}//switch
}
}
// while
GetTop(BT,T);
DestroyStack(BT);
DestroyStack(OPTR);
return 1;
} //CrtExptree