二叉树的创建

来源:互联网 发布: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
原创粉丝点击