二叉树的先序中序后序遍历问题

来源:互联网 发布:淘宝限制购物怎么解除 编辑:程序博客网 时间:2024/06/05 04:20

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

二叉树结构示意图

#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;}

程序运行结果示意图

0 0
原创粉丝点击