二叉树的各种遍历

来源:互联网 发布:美国非农业就业数据 编辑:程序博客网 时间:2024/06/09 20:32
#include<iostream>#include<stack>#include<queue>#include<stdio.h>#include<stdlib.h>using namespace std;//二叉树的各种遍历//二叉树的链式存储定义typedef struct BiTNode{    char data;    struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;//二叉树的创建:通过读入一个字符串,建立二叉树int createBiTree(BiTree &T){    char data;    //按先序序列输入二叉树中结点的值(一个字符),“#”表示空树    scanf("%c",&data);    if(data == '#'){        T = NULL;    }    else{        T = (BiTree)malloc(sizeof(BiTNode));        T->data = data;        createBiTree(T->lchild);        createBiTree(T->rchild);    }    return 0;}//二叉树的遍历(递归算法)//输出void visit(BiTree T){    if(T->data != '#'){        printf("%c ",T->data);    }}//先序遍历void preOrder(BiTree T){    if(T != NULL){        visit(T);        preOrder(T->lchild);        preOrder(T->rchild);    }}//中序遍历void inOrder(BiTree T){    if(T != NULL){        inOrder(T->lchild);        visit(T);        inOrder(T->rchild);    }}//后序遍历void postOrder(BiTree T){    if(T != NULL){        postOrder(T->lchild);        postOrder(T->rchild);        visit(T);    }}//先序遍历的非递归算法//思路:访问T->data后,将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,再遍历T的右子树void preOrder2(BiTree T){    stack<BiTree> stack;    BiTree 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;        }    }}//中序遍历非递归算法//思路:T是要遍历树的指针,中序遍历要求在遍历完左子树后,访问根,再遍历右子树。//先将T入栈,遍历左子树,遍历完左子树返回时,栈顶元素应为T,出栈,访问T->data,再中序遍历T的右子树void inOrder2(BiTree T){    stack<BiTree> stack;    BiTree 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;        }    }}//后序遍历的非递归算法typedef struct BiTNodePost{    BiTree biTree;    char tag;}BiTNodePost,*BiTreePost;void postOrder2(BiTree T){    stack<BiTreePost> stack;    BiTree p = T;    BiTreePost BT;    while(p!= NULL || !stack.empty()){        //遍历左子树        while(p != NULL){            BT = (BiTreePost)malloc(sizeof(BiTreePost));            BT->biTree = p;            //访问过左子树            BT->tag = 'L';            stack.push(BT);            p = p->lchild;        }                //遍历完左子树,访问根结点        while(!stack.empty() && (stack.top()->tag == 'R')){BT = stack.top();              //退栈              stack.pop();              BT->biTree;              printf("%c ",BT->biTree->data);          }                  //遍历右子树        if(!stack.empty()){            BT = stack.top();            //访问过右子树            BT->tag = 'R';            p = BT->biTree;            p = p->rchild;        }    }}//层序遍历void levelOrder(BiTree T){queue<BiTree> queue;BiTree p = T;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(){BiTree T;createBiTree(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;  }  

转载地址:http://blog.csdn.net/sunnyyoona/article/details/24741311

0 0
原创粉丝点击