读书人

中序和后序构造二叉树但结果出现了一

发布时间: 2012-03-15 11:50:38 作者: rapoo

中序和后序构造二叉树,但结果出现了一个问题,结果左子树一个节点错了!请高手帮忙看看!谢谢!急急急。。。
用中序和后序构造二叉树,但结果出现了一个问题,左边的一个节点反了?
请高手帮忙修改一下!谢谢!

C/C++ code
#include <iostream>#include <string>#include <queue>using namespace std;#define OK 1#define ERROR -1void space(int n){    for (int i = 0; i < n; i++) cout << " ";}struct BiTNode{    char data;    BiTNode *lchild, *rchild;};typedef BiTNode *BiTree;typedef int Status;Status CreatePreInBiTreeSq(BiTree &T,char PreOd[],int i,int j,char InOd[],int k,int h){    T = (BiTree)malloc(sizeof(BiTNode));    if (T)        T->data = PreOd[i];//先序的第一个元素为树的根    int m=k;    while(PreOd[i]!=InOd[m])//查找根在中序的位置        m++;    if(m==k)        T->lchild=NULL;    else        CreatePreInBiTreeSq(T->lchild,PreOd,i+1,i+m-k,InOd,k,m-1);//递归调用创建左子树    if(m==h)        T->rchild=NULL;    else        CreatePreInBiTreeSq(T->rchild,PreOd,i+m-k+1,j,InOd,m+1,h);//递归调用创建右子数    return OK;}//根据中序和后序创建二叉树Status CreateInPosBiTreeSq(BiTree &T,char InOd[],int a,int b,char PosOd[],int c,int d){    T = (BiTree)malloc(sizeof(BiTNode));    if (T)        T->data = PosOd[d];//后序的最后一个元素为树的根    int e=a;    while(PosOd[d]!=InOd[e])        e++;    if(e==a)        T->lchild=NULL;    else        CreateInPosBiTreeSq(T->lchild,InOd,a,e-1,PosOd,c,c+e-1);//利用递归创建左子树    if(e==b)        T->rchild=NULL;    else        CreateInPosBiTreeSq(T->rchild,InOd,e+1,b,PosOd,c+e,d-1);//利用递归创建右子树   d-(b-e)+1改为c+e-a    return OK;}void ShowBiTree(BiTree T, int n){    if (!T)        return;    else    {        space(n);        cout << T->data << endl;        ShowBiTree(T->lchild, n+4);        ShowBiTree(T->rchild, n+4);        return;    }}int main(){    BiTree T;    int x;    cout<<"请选择:1、根据先序和中序创建二叉树"<<endl;    cout<<"        2、根据中序和后序创建二叉树"<<endl;    cout<<"请输入:";    cin>>x;    switch(x)    {    case 1:{            int i(0),k(0);            int j,h;            cout<<"输入二叉树元素的个数:";            cin>>j;            h=j;            char *PreOd,*InOd;            PreOd=new char[j];            InOd=new char[h];            cout<<"输入先序:";            for(int    m=0;m<j;m++)                cin>>PreOd[m];            cout<<"输入中序:";            for(int    m=0;m<h;m++)                cin>>InOd[m];            j--;h--;            CreatePreInBiTreeSq(T,PreOd,i,j,InOd,k,h);            cout<<"输入二叉树图形"<<endl;            ShowBiTree(T, 0);           }break;    case 2:{            int a(0),c(0);            int b,d;            cout<<"输入二叉树元素的个数:";            cin>>b;            d=b;            char *InOd,*PosOd;            InOd=new char[b];            PosOd=new char[d];            cout<<"输入中序:";            for(int    n=0;n<b;n++)                cin>>InOd[n];            cout<<"输入后序:";            for(int    n=0;n<d;n++)                cin>>PosOd[n];            b--;d--;            CreateInPosBiTreeSq(T,InOd,a,b,PosOd,c,d);            cout<<"输入二叉树图形"<<endl;            ShowBiTree(T, 0);           }break;            default:break;    }}


[解决办法]
经自己调试可以,你试一试:
C/C++ code
#include <iostream>#include <string>using namespace std;#define OK 1#define ERROR -1void space(int n){    for (int i = 0; i < n; i++) cout << " ";}struct BiTNode{    char data;    BiTNode *lchild, *rchild;};typedef BiTNode *BiTree;typedef int Status;Status CreatePreInBiTreeSq(BiTree &T,char PreOd[],int i,int j,char InOd[],int k,int h){    T = (BiTree)malloc(sizeof(BiTNode));    if (T)        T->data = PreOd[i];//先序的第一个元素为树的根    int m=k;    while(PreOd[i]!=InOd[m])//查找根在中序的位置        m++;    if(m==k)        T->lchild=NULL;    else        CreatePreInBiTreeSq(T->lchild,PreOd,i+1,i+m-k,InOd,k,m-1);//递归调用创建左子树    if(m==h)        T->rchild=NULL;    else        CreatePreInBiTreeSq(T->rchild,PreOd,i+m-k+1,j,InOd,m+1,h);//递归调用创建右子数    return OK;}//根据中序和后序创建二叉树Status CreateInPosBiTreeSq(BiTree &T,char InOd[],int a,int b,char PosOd[],int c,int d){    T = (BiTree)malloc(sizeof(BiTNode));    if (T){        T->data = PosOd[d];//后序的最后一个元素为树的根        printf("Root:%c\n",T->data);    }    cout<<"a="<<a<<",b="<<b<<",c="<<c<<",d="<<d<<endl;    int e=a;    while(PosOd[d]!=InOd[e])        e++;    if(e==a)        T->lchild=NULL;    else        CreateInPosBiTreeSq(T->lchild,InOd,a,e-1,PosOd,c,c+e-1-a);//修改一    if(e==b)        T->rchild=NULL;    else        CreateInPosBiTreeSq(T->rchild,InOd,e+1,b,PosOd,-b+e+1+d-1,d-1);//修改二    return OK;}void ShowBiTree(BiTree T, int n){    if (!T)        return;    else    {        space(n);        cout << T->data << endl;        ShowBiTree(T->lchild, n+4);        ShowBiTree(T->rchild, n+4);        return;    }}int main(){    BiTree T;    int x;    cout<<"请选择:1、根据先序和中序创建二叉树"<<endl;    cout<<"        2、根据中序和后序创建二叉树"<<endl;    cout<<"请输入:";    cin>>x;    switch(x)    {    case 1:{            int i(0),k(0);            int j,h;            cout<<"输入二叉树元素的个数:";            cin>>j;            h=j;            char *PreOd,*InOd;            PreOd=new char[j];            InOd=new char[h];            cout<<"输入先序:";            for(int    m=0;m<j;m++)                cin>>PreOd[m];            cout<<"输入中序:";            for(int    m=0;m<h;m++)                cin>>InOd[m];            j--;h--;            CreatePreInBiTreeSq(T,PreOd,i,j,InOd,k,h);            cout<<"输入二叉树图形"<<endl;            ShowBiTree(T, 0);           }break;    case 2:{            int a(0),c(0);            int b,d;            cout<<"输入二叉树元素的个数:";            cin>>b;            d=b;            char *InOd,*PosOd;            InOd=new char[b];            PosOd=new char[d];            cout<<"输入中序:";            for(int    n=0;n<b;n++)                cin>>InOd[n];            cout<<"输入后序:";            for(int    n=0;n<d;n++)                cin>>PosOd[n];            b--;d--;            CreateInPosBiTreeSq(T,InOd,a,b,PosOd,c,d);            cout<<"输入二叉树图形"<<endl;            ShowBiTree(T, 0);           }break;            default:break;    }} 

读书人网 >C语言

热点推荐