数据结构--树:二叉树的遍历方式(递归和非递归)

来源:互联网 发布:基于arm的ubuntu 编辑:程序博客网 时间:2024/06/08 13:16
#include<stdio.h>#include<iostream>#include<malloc.h>#include<stack>using namespace std;typedef struct BTNode{char data;struct BTNode *lchild;struct BTNode *rchild;}BTNode,*BTree;void CreateBTree(BTree &T){char ch;ch=getchar();if(ch=='#'){T=NULL;return;}else{T=(BTNode*)malloc(sizeof(BTNode));T->data=ch;CreateBTree(T->lchild);CreateBTree(T->rchild);}}void PreOrder(BTree T)      // 先序遍历--递归{if(T==NULL)return;cout<<T->data;PreOrder(T->lchild );PreOrder(T->rchild );}void Preorder(BTree T)              // 先序遍历--非递归{if(T==NULL)return;BTNode *p=T;stack<BTree> S;while(p!=NULL||!S.empty()){if(p!=NULL){S.push(p);cout<<p->data ;p=p->lchild;}else{p=S.top();S.pop();p=p->rchild;}}}void InOrder(BTree T)         // 中序遍历--递归{if(T==NULL)return ;InOrder(T->lchild );cout<<T->data ;InOrder(T->rchild );}void Inorder(BTree T)          // 中序遍历--非递归{if(T==NULL)return;BTNode *p=T;stack<BTree> S;while(p!=NULL||!S.empty()){if(p!=NULL)            //走到最左边{S.push(p);p=p->lchild;}else                //向右{ p=S.top();      //取栈顶结点S.pop();cout<<p->data ;p=p->rchild;}}}void PostOrder(BTree T){if(T==NULL)return;PostOrder(T->lchild );PostOrder(T->rchild );cout<<T->data ;}void Postorder(BTree T)              // 先序遍历--非递归{if(T==NULL)return;BTNode *p=T,*r=NULL;stack<BTree> S;while(p!=NULL||!S.empty()){if(p!=NULL)    //走到最左边{S.push(p);p=p->lchild ;}else         //向右{p=S.top();   //取栈顶结点if(p->rchild&&p->rchild !=r)  //如果右子树存在,且未被访问过{p=p->rchild;   //转向右S.push(p);  p=p->lchild ;   //再走到最左}else                        //否则,说明右子树已经被访问过, 弹出结点并访问{p=S.top();S.pop();  cout<<p->data ;r=p;          //指向最近访问过的结点p=NULL;       //结点访问完后,重置p指针}}}}void main(){BTree T;printf("递归先序建立二叉树(空节点用#代替):");CreateBTree(T);printf("递归先序遍历:");PreOrder(T);printf("\n");printf("非递归先序遍历:");Preorder(T);printf("\n");printf("递归中序遍历:");InOrder(T);printf("\n");printf("非递归中序遍历:");Inorder(T);printf("\n");printf("递归后序遍历:");PostOrder(T);printf("\n");printf("非递归后序遍历:");Postorder(T);printf("\n");}

0 0
原创粉丝点击