二叉树的创建和遍历

来源:互联网 发布:淘宝店如何 编辑:程序博客网 时间:2024/05/29 17:48
/*二叉树的创建和遍历,有递归和非递归的形式*/#include <iostream>#include <stack>#include <queue>#include <cstdlib>//used in "malloc"using namespace std;//二叉树的节点typedef struct BitNode{    char data;    struct BitNode *lchild,*rchild;}BitNode,*BitTree;int CreateBitTree(BitTree &T){    char data;    scanf("%c",&data);    if(data == '#'){        T = NULL;    }    else{        T = (BitTree)malloc(sizeof(BitNode));        T -> data = data;        CreateBitTree(T -> lchild);        CreateBitTree(T -> rchild);            }    return 0;}void Visit(BitTree T){    if(T -> data != '#'){        printf("%c",T->data);    }}void PreOrder(BitTree T){    if(T != NULL){        Visit(T);        PreOrder(T->lchild);        PreOrder(T->rchild);    }}void PreOrder2(BitTree T){    stack<BitTree> stack;    BitTree p = T;    while(p || !stack.empty()){        if(p != NULL){            stack.push(p);            printf("%c",p->data);            p = p->lchild;        }        else{            p = stack.top();            stack.pop();            p = p->rchild;        }    }}void InOrder(BitTree T){    if(T != NULL){        InOrder(T->lchild);        Visit(T);        InOrder(T->rchild);    }}void InOrder2(BitTree T){    stack<BitTree> stack;    BitTree p = T;    while(p || !stack.empty()){        if(p != NULL){            stack.push(p);                        p = p->lchild;        }        else{            p = stack.top();            printf("%c",p->data);            stack.pop();            p = p->rchild;        }    }}void PostOrder(BitTree T){    if(T != NULL){        PostOrder(T->lchild);        PostOrder(T->rchild);        Visit(T);    }}void PostOrder2(BitTree T){    stack<BitTree> stack;    BitTree curr = T;//指向当前要检查的节点    BitTree previsited = NULL;//指向前一个被访问的节点    while(curr != NULL || !stack.empty()){        while(curr != NULL){  //一直往走走直到为空            stack.push(curr);            curr = curr->lchild;        }        curr = stack.top();        // 当前节点的右孩子如果为空或者已经被访问,则访问当前节点           if(curr -> rchild ==  NULL || curr->rchild == previsited){            printf("%c",curr->data);            previsited = curr;            stack.pop();            curr = NULL;        }        else curr = curr->rchild; //否则访问右节点    }}void LevelOrder(BitTree T){    BitTree p = T;    queue<BitTree> queue;    queue.push(p);    while(!queue.empty()){        p = queue.front();        printf("%c",p->data);        queue.pop();        if(p->lchild != NULL){            queue.push(p->lchild);        }        if(p->rchild != NULL){            queue.push(p->rchild);        }            }}int main()  {      BitTree T;      CreateBitTree(T);      printf("先序遍历:\n");      PreOrder(T);      printf("\n");      printf("先序遍历(非递归):\n");      PreOrder2(T);      printf("\n");      printf("中序遍历:\n");      InOrder(T);      printf("\n");      printf("中序遍历(非递归):\n");      InOrder2(T);      printf("\n");      printf("后序遍历:\n");      PostOrder(T);      printf("\n");      printf("后序遍历(非递归):\n");      PostOrder2(T);      printf("\n");      printf("层次遍历:\n");      LevelOrder(T);      printf("\n");      return 0;  } 


1 0