数据结构把顺序存储的二叉树转换成链式存储及前序,中序,后序遍历

来源:互联网 发布:同花顺看盘软件 编辑:程序博客网 时间:2024/05/19 16:07

代码如下:

#include<iostream>#include<string.h>#include<stdio.h>#include<stack>#define MAX 10using namespace std;typedef struct node{    char data;    node *lchild;    node *rchild;    }BTnode,*BinTree;typedef struct elem{    char data;    int lchild,rchild;    int tag;    BTnode *link;    }element;element A[MAX];BinTree root;BTnode *p,*pl,*pr;stack<BinTree>ST;BTnode* BuildTree(){    for(int i=0;i<MAX;i++){        if(A[i].tag==-1){            p=new BTnode;            p->data=A[i].data;            A[i].tag=1;            A[i].link=p;          }else{            p=A[i].link;            }        if(A[i].lchild!=-1){            int j=A[i].lchild;            pl=new BTnode;            pl->data=A[j].data;            A[j].tag=1;            A[j].link=pl;             p->lchild=pl;           }else{            p->lchild=NULL;         }        if(A[i].rchild!=-1){            int j=A[i].rchild;            pr=new BTnode;            pr->data=A[j].data;            A[j].tag=1;            A[j].link=pr;            p->rchild=pr;        }else{            p->rchild=NULL;            }    }    return A[0].link;}void PreOrder(BinTree root){    while(!ST.empty()) ST.pop();    p=root;    while(p!=NULL||(!ST.empty())){        if(p!=NULL){            ST.push(p);            cout<<p->data<<endl;            p=p->lchild;            }else{            p=ST.top();            ST.pop();            p=p->rchild;            }    }}void InOrder(BTnode* root){    while(!ST.empty()) ST.pop();    p=root;    while(p!=NULL||(!ST.empty())){        if(p!=NULL){            ST.push(p);            p=p->lchild;            }else{            p=ST.top();            cout<<p->data<<endl;            ST.pop();            p=p->rchild;        }    }}typedef struct Node{    BTnode* ptr;    char tag;    }e;stack<e>Stack;e w;void PosOrder(BTnode* root){    p=root;    while(!Stack.empty()) Stack.pop();    while(p!=NULL||(!Stack.empty())){        if(p!=NULL){            w.ptr=p;            w.tag='L';            Stack.push(w);            p=p->lchild;        }else{            w=Stack.top();            Stack.pop();            p=w.ptr;            if(w.tag=='L'){                w.tag='R';                Stack.push(w);                p=p->rchild;                }else{                printf("%c\n",p->data);                //cout<<p->data<<endl;                p=NULL;                }        }    }}int main(){    for(int i=0;i<MAX;i++){        scanf("%s %d %d",&A[i].data,&A[i].lchild,&A[i].rchild);        A[i].tag=-1;        A[i].link=NULL;    }    root=BuildTree();    PreOrder(root);    puts("");    InOrder(root);    puts("");    PosOrder(root);    getchar();getchar();getchar();getchar();getchar();    getchar();getchar();getchar();getchar();getchar();return 0;    }