已知先序和中序或中序和后序序列建立二叉树并遍历

#include<iostream>
#include<queue>
using namespace std;
typedef struct BTNode {
char data;
struct BTNode *lchild, *rchild;
}BTNode, *BTree;
queue<BTree> Q;
void DLR(BTree T)
{
if (T)
{
cout << T->data<<" ";
DLR(T->lchild);
DLR(T->rchild);
}
}
void LDR(BTree T)
{
if (T)
{
LDR(T->lchild);
cout << T->data << " ";
LDR(T->rchild);
}
}
void LRD(BTree T)
{
if (T)
{
LRD(T->lchild);
LRD(T->rchild);
cout << T->data<<" ";
}
}
void LevelOrderTraverse(BTree T)
{
cout << T->data << " ";
if(T->lchild) Q.push(T->lchild);
if(T->rchild) Q.push(T->rchild);
Q.pop();
if (!Q.empty())LevelOrderTraverse(Q.front());
}
void Create_posOrder(BTree &T,char *pre,char *mid,int n)//已知先序、中序时建立二叉树
{
T = new BTNode;
if (n <= 0)
{
T = NULL;
return;
}
T->data = *pre;
char *pos;
int i;
for (pos = mid; pos < mid + n; pos++)
{
if (*pos == *pre) break;
}
i = pos - mid;
Create_posOrder(T->lchild, pre + 1,mid,i);
Create_posOrder(T->rchild, pre+i + 1,pos + 1, n - i - 1);
}
void Create_preOrder(BTree &T,char *mid,char *pos,int n)//已知中序、后序时建立二叉树
{
T = new BTNode;
if (n <= 0)
{
T = NULL;
return;
}
char *pre;
int i;
for (pre = mid; pre < mid + n; pre++)
{
if (*pre == *(pos + n - 1)) break;
}
i = pre - mid;
T->data = *pre;
Create_preOrder(T->lchild, mid ,pos,i);
Create_preOrder(T->rchild, pre + 1,pos+i,n-i-1);
}
int main()
{
char pre[] = "ABDEGCF";//先序序列
char mid[] = "DBGEACF";//中序序列
char pos[] = "DGEBFCA";//后序序列
BTree T1,T2;
Create_posOrder(T1, pre, mid, strlen(pre));
cout << "先序遍历:";
DLR(T1);
cout << endl;
cout << "中序遍历:";
LDR(T1);
cout << endl;
cout << "后序遍历:";
LRD(T1);
cout << endl;
cout << "层序遍历:";
Q.push(T1);
LevelOrderTraverse(Q.front());
cout << endl;
cout << endl;
Create_preOrder(T2, mid, pos, strlen(pos));
cout << "先序遍历:";
DLR(T2);
cout << endl;
cout << "中序遍历:";
LDR(T2);
cout << endl;
cout << "后序遍历:";
LRD(T2);
cout << endl;
cout << "层序遍历:";
Q.push(T2);
LevelOrderTraverse(Q.front());
cout << endl;
cout << endl;
return 0;
}
