二叉树遍历非递归算法
来源:互联网 发布:淘宝退货物流信息填错 编辑:程序博客网 时间:2024/05/29 04:07
输入代码:
#include <stdio.h>#include <malloc.h>#define MaxSize 100typedef char ElemType;using namespace std;typedef struct node{ ElemType data; struct node *lchild; struct node *rchild;} BTNode;/*建立二叉树*/void CreateBTNode(BTNode *&b,char *str){ BTNode *St[MaxSize],*p; int top=-1,k,j=0; char ch; b=NULL; ch=str[j]; while(ch!='\0') { switch(ch) { case '(': top++; St[top]=p; k=1; break; case ')': top--; break; case ',': k=2; break; default: p=(BTNode *)malloc(sizeof(BTNode)); p->data=ch; p->lchild=p->rchild=NULL; if(b==NULL) b=p; else { switch(k) { case 1: St[top]->lchild=p; break; case 2: St[top]->rchild=p; break; } } } j++; ch=str[j]; }}void PreOrder1(BTNode *b) //先序非递归遍历算法{ BTNode *St[MaxSize],*p; int top=-1; //根节点进栈 if(b!=NULL) { top++; St[top]=b; while(top>-1) //栈不为空时进栈 { p=St[top]; //退栈并访问该节点 top--; printf("%c",p->data); if(p->rchild!=NULL) //右孩子节点进栈 { top++; St[top]=p->rchild; } if(p->lchild!=NULL) //左孩子节点进栈 { top++; St[top]=p->lchild; } } printf("\n"); }}void InOrder(BTNode *b) //中序遍历非递归算法{ BTNode *St[MaxSize],*p; int top=-1; if(b!=NULL) { p=b; while(top>-1||p!=NULL) //处理*b节点的左子树 { while(p!=NULL) //扫描*p的所有左节点并进栈 { top++; St[top]=p; p=p->lchild; } //执行到此处时,栈顶元素没有左孩子或左子树均已访问过 if(top>-1) { p=St[top]; //出栈*p节点 top--; printf("%c",p->data); //访问之 p=p->rchild; //转向处理*p的右孩子节点 } } printf("\n"); }}void PostOrder(BTNode *b) //后序遍历的非递归算法{ BTNode *St[MaxSize],*p; int top=-1,flag; if(b!=NULL) { do { while(b!=NULL) //扫描*p的所有左节点并进栈 { top++; St[top]=b; b=b->lchild; } //执行到此处时,栈顶元素没有左孩子或者左子树均已访问过 p=NULL; //p指向栈顶节点的前一个已访问过的节点 flag=1; //表示*b的左孩子已访问或为空 while(top!=-1&&flag) { b=St[top]; //取出当前栈顶元素 if(b->rchild==p) /* 若*p=NULL,表示b的右孩子不存在,而其左子树不存在或已访问,可以访问*b; 若*p!=NULL,表示b的右子树已访问,可以访问*b。 */ { printf("%c",b->data); top--; p=b; } else { b=b->rchild; flag=0; } } } while(top!=-1); printf("\n"); }}int main(){ BTNode *b; CreateBTNode(b,"A(B(D(,G)),C(E,F))"); printf("先序遍历:"); PreOrder1(b); printf("中序遍历:"); InOrder(b); printf("后序遍历:"); PostOrder(b); return 0;}
运行截图:
1 0
- 二叉树遍历非递归算法
- 二叉树遍历的非递归算法
- 非递归遍历二叉树算法
- 二叉树遍历非递归算法
- 二叉树 遍历非递归算法
- 遍历二叉树的非递归算法
- 遍历二叉树的非递归算法
- 二叉树遍历算法非递归
- 二叉树遍历(非递归算法)
- 二叉树遍历非递归算法
- 二叉树遍历之非递归算法
- 二叉树遍历之非递归算法
- 非递归二叉树层次遍历算法
- 二叉树的遍历非递归算法
- 遍历二叉树的非递归算法
- 二叉树遍历算法(非递归)
- 二叉树遍历之非递归算法
- 二叉树的遍历非递归算法
- python之函数基础篇
- sublime2打开其他文件中文乱码问题--亲测有效
- 第十三周上机实践项目:阅读、修改和运行关于交通工具类的程序(1)
- redis 连接报错 GET_LIKE_ERROR 处理过程
- Java模块 -- 读取Excel文件写入数据库 Mybatis , POI , JXL
- 二叉树遍历非递归算法
- Android小程序——乐学成语实现(三)
- RxJava实现view的双击事件
- USACO5.5 降维扫描/离散_最小表示法_记忆化搜索
- Android打造万能适配器(一)再谈传统适配器
- ajaxfileupload IE10 拒绝访问
- eclipse中的tomcat,代码中创建file获取目录与tomcat单独运行获取目录不同的解决办法
- Phone状态的监听机制
- 项目中如何只计算一次cell的高度