二叉树先序,中序,后序遍历非递归实现
2014-09-20 10:45
134 查看
</pre><pre name="code" class="cpp">#include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> #include<stack> using namespace std; char in[30],pre[30],last[30]; typedef struct mynode { char data; struct mynode* leftchild; struct mynode* rightchild; } Node,*pNode; void build(char *pre,char *in,int len,pNode &root) { if(len<1) return; int i=0; while(pre[0]!=in[i])i++; root = (pNode)malloc(sizeof(Node)); root->data = pre[0]; root->rightchild = root->leftchild = NULL; build(pre+1,in,i,root->leftchild); build(pre+i+1,in+i+1,len-i-1,root->rightchild); } //层序遍历 void seqorder(pNode root) { pNode temp; queue<pNode> qe; qe.push(root); while(!qe.empty()) { temp = qe.front(); qe.pop(); printf("%c",temp->data); if(temp->leftchild) qe.push(temp->leftchild); if(temp->rightchild) qe.push(temp->rightchild); } } //中序遍历 void inorder(pNode root) { if(NULL==root) return; inorder(root->leftchild); printf("%c",root->data); inorder(root->rightchild); } //前序遍历 void preorder(pNode root) { if(NULL==root) return; printf("%c",root->data); preorder(root->leftchild); preorder(root->rightchild); } //后续遍历 void lastorder(pNode root) { if(NULL==root)return; lastorder(root->leftchild); lastorder(root->rightchild); printf("%c",root->data); } //前序非递归 void _preorder(pNode root) { stack<pNode> stk; while(!stk.empty()||root==NULL) { while(root) { stk.push(root); printf("%c",root->data); root = root->leftchild; } root = stk.top(); root = root->rightchild; stk.pop(); } } //中序遍历非递归 void _inorder(pNode root) { stack<pNode> stk; while(root||!stk.empty()) { while(root) { stk.push(root); root = root->leftchild; } root = stk.top(); stk.pop(); printf("%c",root->data); root = root->rightchild; } } //后续遍历非递归 void _lastorder(pNode root) { int flag[30]; stack<pNode> stk; while(root) { stk.push(root); flag[stk.size()] = 0; root = root->leftchild; } while(!stk.empty()) { root = stk.top(); while(root->rightchild&&flag[stk.size()]==0) { flag[stk.size()] = 1; root = root->rightchild; while(root) { stk.push(root); flag[stk.size()] = 0; root = root->leftchild; } root = stk.top(); } printf("%c",root->data); stk.pop(); } } int main(void) { scanf("%s %s",pre,in); pNode root; build(pre,in,strlen(pre),root); //lastorder(root); _lastorder(root); return 0; }
相关文章推荐
- 二叉树先序、中序、后序遍历的非递归实现
- 二叉树的遍历:前序、中序、后序、层序的非递归实现
- 利用栈实现二叉树的先序,中序,后序遍历的非递归操作
- 二叉树先序、中序、后序遍历的非递归实现
- 二叉树先序、中序、后序遍历的非递归实现
- 二叉树前序、中序、后序遍历的递归与非递归算法实现
- 二叉树先序,中序,后序遍历非递归实现
- 二叉树的前序、中序、后序遍历 递归非递归实现
- ZT 二叉树先序,中序,后序遍历非递归实现
- 二叉树的遍历:前序,中序,后序,层序--包括递归和非递归实现
- 二叉树的遍历:前序,中序,后序,层序--包括递归和非递归实现
- 二叉树的遍历 前序 中序 后序 分别实现递归和非递归遍历方式
- 用非递归实现二叉树的前序、中序、后序、层次遍历,用递归实现查找、统计个数、比较、求深度
- 二叉树的遍历:前序,中序,后序,层序--包括递归和非递归实现
- java语言实现二叉树的前序、中序与后序遍历(递归与非递归)
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 二叉树的创建,先序、中序、后序遍历的递归实现以及层序遍历
- [转]非递归实现二叉树的前序,中序,后序遍历
- 二叉树先序、中序、后序遍历的非递归实现,纯c代码
- 二叉树的遍历(前序、中序、后序、层序),递归和非递归实现