非递归遍历二叉树
来源:互联网 发布:淘宝多肉种子哪家好 编辑:程序博客网 时间:2024/06/04 18:55
#include<iostream>#include<stdlib.h>#include<stdio.h>using namespace std;#define OK 1#define ERROR 0#define OVERFLOW 0#define TRUE 1#define FALSE 0typedef char TElemType;typedef struct BiTNode{ TElemType data; struct BiTNode *lchild,*rchild;} BiTNode,*BiTree;typedef BiTree sElemType;typedef int Status;typedef struct StackNode{ sElemType data; struct StackNode *next;} StackNode,*LinkStackPtr;typedef struct LinkStack{ LinkStackPtr top; int sum;} LinkStack;//栈空Status StackEmpty(LinkStack *S){ if(S->sum == 0) { return TRUE; } else { return FALSE; }}//入栈Status Push(LinkStack *S,sElemType e){ LinkStackPtr ls = (LinkStackPtr)malloc(sizeof(StackNode)); ls->data = e; ls->next = S->top; S->top = ls; S->sum++; return OK;}//出栈Status Pop(LinkStack *S,sElemType &e){ if(StackEmpty(S)) { cout<<"栈空"<<endl; return ERROR; } LinkStackPtr p = S->top; S->top = p->next; e = p->data; free(p); S->sum--; return OK;}//获取栈顶元素Status GetTop(LinkStack *S,sElemType &e){ if(StackEmpty(S)) { cout<<"栈空"<<endl; return ERROR; } LinkStackPtr p = S->top; e = p->data; free(p); return OK;}Status init_BiTree(BiTree &T){ T = (BiTree)malloc(sizeof(BiTNode)); if(!T) { exit(OVERFLOW); } return OK;}Status CreateBiTree(BiTree &T){ BiTree b = (BiTree)malloc(sizeof(BiTNode)); char ch = cin.get(); if(ch == ' ') { cout<<"NUll"<<endl; T = NULL; } else { cout<<"再次输入-------------"<<endl; if(!(T=(BiTree)malloc(sizeof(BiTNode)))) { exit(OVERFLOW); } T ->data = ch; CreateBiTree(T->lchild); CreateBiTree(T->rchild); } return OK;}//中序遍历 循环:(向左走到尽头,弹出空结点后,取栈顶元素数据,然后将其右孩子压入栈)Status InOrderTraverse (BiTree T,Status (*Visit)(TElemType e)){ LinkStack *S ; S=(LinkStack*)malloc(sizeof(LinkStack)); S->sum=0; Push(S,T); BiTree p; while(!StackEmpty(S)) { while(GetTop(S,p)&&p) { Push(S,p->lchild);//向左走到尽头 } Pop(S,p); if(!StackEmpty(S)) { Pop(S,p); if(!Visit(p->data)) { return ERROR; } Push(S,p->rchild); } } return OK;}//前序遍历Status PreOrderTraverse (BiTree T,Status (*Visit)(TElemType e)){ LinkStack *S ; //InitStack(S); S=(LinkStack*)malloc(sizeof(LinkStack)); S->sum=0; Push(S,T); BiTree p; while(!StackEmpty(S)) { while(GetTop(S,p)&&p) { if(!Visit(p->data)) { return ERROR; } Push(S,p->lchild);//向左走到尽头 } Pop(S,p);//弹出空结点 if(!StackEmpty(S)) { Pop(S,p);//弹出左兄弟结点 Pop(S,p);//弹出双亲 Push(S,p->rchild);//右兄弟结点压入栈中 } } return OK;}//后续遍历Status PostOrderTraverse(BiTree T,Status(*Visit)(TElemType e)){ LinkStack *S; S = (LinkStack*)malloc(sizeof(LinkStack)); S->sum = 0; BiTree p;//当前结点 BiTree pLastVisit;//记录上次访问的结点 Push(S,T); while(GetTop(S,p)&&p) { Push(S,p->lchild);//向左走到尽头 } Pop(S,p);//弹出空结点 while(!StackEmpty(S)) { Pop(S,p); if(p) { //如果没有右子树或右子树已经访问过(输出结点包含的数值),再访问该结点数 if(p->rchild == NULL||p->rchild==pLastVisit) { if(!Visit(p->data)) { return ERROR; } pLastVisit = p; } //如果有右子树且没有访问过,右结点入栈,同时向左走到尽头 else { Push(S,p); p = p->rchild; while(p) { Push(S,p); p = p->lchild; } } } }}Status Visit(TElemType e){ if(e ==NULL) { return ERROR; } cout<<e<<"--"; return OK;}int main(){ BiTree T; CreateBiTree(T); cout<<"输入完毕"<<endl; PostOrderTraverse(T,Visit);}
0 0
- 非递归遍历二叉树
- 二叉树遍历非递归
- 非递归遍历二叉树
- 二叉树非递归遍历
- 二叉树非递归遍历
- 非递归遍历二叉树
- 二叉树非递归遍历
- 非递归遍历二叉树
- 非递归遍历二叉树
- 非递归遍历二叉树
- 非递归遍历二叉树
- 非递归遍历二叉树
- 二叉树非递归遍历
- 二叉树遍历--非递归
- 二叉树非递归遍历
- 非递归遍历二叉树
- 二叉树非递归遍历
- 二叉树非递归遍历
- 大数据在医疗领域的应用
- JavaScript 内存泄漏教程
- Linux常用指令(笔记)
- android java进程管理(六)之apk进程的回收
- Python 装饰器装饰类中的方法
- 非递归遍历二叉树
- sql 查询快捷方式
- 静态库的制作以及第三方框架iOS Universal Framework,DEBUG和RELEASE
- Linux服务器磁盘空间不足异常
- 【Sonar】Sonar理论篇
- 很好用的panel或者用户控件绘制边框颜色命令
- [Android] hook 和 inject 的区别与联系
- 实现UncaughtExceptionHandler来实现获取应用全局的crash信息
- 从零到实现Shiro中Authorization和Authentication的缓存