二叉树的前序、中序、后序遍历(非递归)
来源:互联网 发布:sql join 编辑:程序博客网 时间:2024/06/05 08:44
一、前中后序的非递归遍历
代码中采用先序遍历的方法创建二叉树,示例创建二叉树格式如下:
创建过程中,以表示空节点。
代码:
#include <stdio.h>#include <stdlib.h>typedef struct BTNode{ char data; struct BTNode *left; struct BTNode *right;}BTNode,*BTree;typedef struct Stack{ BTree data[101]; int top;}BTStack;typedef struct Post_BTNode{ BTNode * Post_Node; int tag;}Post_BTNode,*Post_BTree;typedef struct Post_Stack{ Post_BTNode data[101]; int top;}Post_Stack;BTree CreatBTree(BTree root)//先序构建二叉树{ char data; scanf("%c",&data); getchar(); if(data == '*') root = NULL; else{ root = (BTree)malloc(sizeof(BTNode)); root->data = data; root->left = CreatBTree(root->left); root->right = CreatBTree(root->right); } return root;}void PreOrder_NonRec(BTree root)//先序遍历非递归{ BTStack stack; stack.top = -1; BTNode *p=NULL; if(NULL != root) { stack.data[++stack.top] = root; while(stack.top > -1) { p = stack.data[stack.top--]; printf(" %c",p->data); if(NULL != p->right) stack.data[++stack.top] = p->right; if(NULL != p->left) stack.data[++stack.top] = p->left; } } printf("\n");}void Inorder_NonRec(BTree root)//中序遍历非递归{ BTStack stack; BTNode *p = NULL; stack.top = -1; p = root; while(NULL != p || stack.top > -1) { while(NULL != p) { stack.data[++stack.top]=p; p = p->left; } p = stack.data[stack.top--]; printf(" %c",p->data); p = p->right; } printf("\n");}void PostOrder_NonRec(BTree root)//后续遍历非递归{ Post_Stack stack; Post_BTNode node; BTNode * p=NULL; p= root; stack.top = -1; while(NULL != p || stack.top > -1) { while(NULL != p) { node.Post_Node=p; node.tag = 1; stack.data[++stack.top] = node; p = p->left; } node = stack.data[stack.top--]; if(node.tag == 1) { node.tag = 2; stack.data[++stack.top] = node; p = node.Post_Node->right; } else if(node.tag == 2) { p = node.Post_Node; printf(" %c",p->data); p = NULL; } } printf("\n");}int main(){ BTree root=NULL; root = CreatBTree(root); printf("PreOrder:"); PreOrder_NonRec(root); printf("InOrder:"); Inorder_NonRec(root); printf("PostOrder:"); PostOrder_NonRec(root); return 0;}
运行结果:
二、根据前序和中序求后序
直接上代码(有注释):
#include <stdio.h>#include <string.h>void preInToPost(char * pre,char * in, int size){ if(size == 0) { return ; } char ch = *(pre+0); //当前子树的根节点 int rootIndex = 0; //查找当前子树的根节点在中序遍历中的位置 for(;rootIndex<size;rootIndex++) { if(ch == *(in+rootIndex)) break; } preInToPost(pre+1,in,rootIndex); //递归根据左子树的前序和中序求后序 preInToPost(pre+rootIndex+1,in+rootIndex+1,size-(rootIndex+1)); //递归根据右子树的前序中序求后序 printf("%c",ch); //因为是后序序列,所以在左右子树输出完后输出当前根节点}int main(){ char * preOrder = "abchdefg"; //前序序列 char * inOrder = "hcbdafeg"; //中序序列 int size = strlen(preOrder); printf("前序序列:%s\n",preOrder); printf("中序序列:%s\n",inOrder); printf("后序序列:"); preInToPost(preOrder,inOrder,size); return 0;}
结果:
- 二叉树的非递归【前/中/后 序遍历】
- 二叉树的创建,遍历(前序,中序,后序)-递归 非递归
- 二叉树的前序、中序、后序(递归、非递归)遍历java实现
- 数据结构:二叉树的前序,中序,后序遍历(递归和非递归)
- 二叉树的递归和非递归遍历(前序、中序、后序)
- 二叉树的前序、中序、后序遍历(递归&非递归)
- 二叉树的前序、中序、后序遍历(递归与非递归)
- 二叉树的递归与非递归遍历(前序、中序、后序)
- 二叉树的递归与非递归遍历(前序、中序、后序)
- 二叉树的递归与非递归遍历(前序、中序、后序)
- 二叉树的递归与非递归遍历(前序、中序、后序)
- 二叉树的非递归遍历以及层次遍历(前序、中序、后序)
- (前、中、后)序遍历二叉树的递归、非递归算法!
- 【数据结构】二叉树(前、中、后)序遍历的递归与非递归算法
- 二叉树的前/中/后 序遍历(递归非递归两种)
- JAVA实现二叉树的前、中、后序遍历(递归与非递归)
- 前,中,后序遍历二叉树 (递归 && 非递归的栈 && 非递归非栈的线索二叉树)
- 【二叉树】 前序、中序和后序的递归遍历与非递归遍历
- vim 小技巧------写程序注释
- [转]nginx下如何增加网站
- 九度OJ月赛---题目1534:数组中第K小的数字 (二分搜索)
- UVa 10986 Sending email 优先队列优化的dijkstra 和 朴素dijkstra 效率对比
- 11. 求二叉树中节点的最大距离
- 二叉树的前序、中序、后序遍历(非递归)
- [转]apache下如何增加网站for linux(绑定域名)
- 如何在ubuntu13.04启动ssh
- 各种编程语言和方式对比
- 数位dp+LIS+状态压缩-hdu-4352-XHXJ's LIS
- 系统设计之粒度控制
- Java 基础加强 - 反射Reflect
- 协方差与自相关
- 如何在GWT实现点击Button(或其他Widget)打开文件选择对话框