利用栈实现二叉树的先序,中序,后序遍历的非递归操作
2013-09-29 18:32
381 查看
中序遍历
先序遍历
后序遍历
[/code]
这三个都属于深度优先
还有广度优先的遍历,利用队列解决。
下面是转的
利用栈实现二叉树的先序,中序,后序遍历的非递归操作
[cpp] view
plaincopy
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <queue>
#include <stack>
#include <iostream>
using namespace std;
typedef struct BiTNode{
char data;
BiTNode *lchild, *rchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree &T)//建树,按先序顺序输入节点
{
char ch;
scanf("%c",&ch);
if(ch==' ')
{
T=NULL;
return;
}
else
{
T=(BiTree)malloc(sizeof(BiTNode));
if(!T)
exit(1);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void InOrderTraverse(BiTree T)//非递归中序遍历
{
stack<BiTree> Stack;
if(!T)
{
printf("空树!\n");
return;
}
while(T || !Stack.empty())
{
while(T)
{
Stack.push(T);
T=T->lchild;
}
T=Stack.top();
Stack.pop();
printf("%c",T->data);
T=T->rchild;
}
}
void PreOrderTraverse(BiTree T)//非递归先序遍历
{
stack<BiTree> Stack;
if(!T)
{
printf("空树!\n");
return;
}
while(T || !Stack.empty())
{
while(T)
{
Stack.push(T);
printf("%c",T->data);
T=T->lchild;
}
T=Stack.top();
Stack.pop();
T=T->rchild;
}
}
void PostOrderTraverse(BiTree T)//非递归后序遍历,用一个标记标记右子树是否访问过
{
int flag[20];
stack<BiTree> Stack;
if(!T)
{
printf("空树!\n");
return;
}
while(T)
{
Stack.push(T);
flag[Stack.size()]=0;
T=T->lchild;
}
while(!Stack.empty())
{
T=Stack.top();
while(T->rchild && flag[Stack.size()]==0)
{
flag[Stack.size()]=1;
T=T->rchild;
while(T)
{
Stack.push(T);
flag[Stack.size()]=0;
T=T->lchild;
}
}
T=Stack.top();
printf("%c",T->data);
Stack.pop();
}
}
void main()
{
BiTree T;
CreateBiTree(T);
PreOrderTraverse(T);
printf("\n");
InOrderTraverse(T);
printf("\n");
PostOrderTraverse(T);
printf("\n");
}
void inOrder(BiTree T,void(*vist)( element e)){ stack<Bitree> S; while (true){ if (T) { s.push(T);T=T->Lchild;} else {T=s.pop(s); visit(T);T=T->Rchild;} if(s.empty()) break; } }
先序遍历
void inOrder(BiTree T,void(*vist)( element e)){ stack<Bitree> S; while(true){ if(T){ visit(T); if(T->rChild) s.push(T->rChild);T=T->lChild;} else {T=s.pop();} }if (s.empty()) break; }
后序遍历
void inOrder(BiTree T,void(*vist)( element e)){ stack<Bitree> S; int flat[20]; while(true){ while(true){ s.push(T);T=T->lChild; flag(s.size()]=0; if (!T){ T=->rChild; if (T) flag[s.size()]=1; else break;} while (true){ if(flag[s.size()]){ T=s.pop(); visit(T);} else T=T->rChild; } if (s.empty()) break; } }
[/code]
这三个都属于深度优先
还有广度优先的遍历,利用队列解决。
下面是转的
利用栈实现二叉树的先序,中序,后序遍历的非递归操作
[cpp] view
plaincopy
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <queue>
#include <stack>
#include <iostream>
using namespace std;
typedef struct BiTNode{
char data;
BiTNode *lchild, *rchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree &T)//建树,按先序顺序输入节点
{
char ch;
scanf("%c",&ch);
if(ch==' ')
{
T=NULL;
return;
}
else
{
T=(BiTree)malloc(sizeof(BiTNode));
if(!T)
exit(1);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void InOrderTraverse(BiTree T)//非递归中序遍历
{
stack<BiTree> Stack;
if(!T)
{
printf("空树!\n");
return;
}
while(T || !Stack.empty())
{
while(T)
{
Stack.push(T);
T=T->lchild;
}
T=Stack.top();
Stack.pop();
printf("%c",T->data);
T=T->rchild;
}
}
void PreOrderTraverse(BiTree T)//非递归先序遍历
{
stack<BiTree> Stack;
if(!T)
{
printf("空树!\n");
return;
}
while(T || !Stack.empty())
{
while(T)
{
Stack.push(T);
printf("%c",T->data);
T=T->lchild;
}
T=Stack.top();
Stack.pop();
T=T->rchild;
}
}
void PostOrderTraverse(BiTree T)//非递归后序遍历,用一个标记标记右子树是否访问过
{
int flag[20];
stack<BiTree> Stack;
if(!T)
{
printf("空树!\n");
return;
}
while(T)
{
Stack.push(T);
flag[Stack.size()]=0;
T=T->lchild;
}
while(!Stack.empty())
{
T=Stack.top();
while(T->rchild && flag[Stack.size()]==0)
{
flag[Stack.size()]=1;
T=T->rchild;
while(T)
{
Stack.push(T);
flag[Stack.size()]=0;
T=T->lchild;
}
}
T=Stack.top();
printf("%c",T->data);
Stack.pop();
}
}
void main()
{
BiTree T;
CreateBiTree(T);
PreOrderTraverse(T);
printf("\n");
InOrderTraverse(T);
printf("\n");
PostOrderTraverse(T);
printf("\n");
}
相关文章推荐
- Cocos2d-x建工程时避免copy文件夹和库
- CRC32查表法
- Emmet:HTML/CSS代码快速编写神器
- mapreduce之组件,join,排序原理
- ubuntu下用的虚拟机(虚拟机上可以装xp)
- 在Android button上添加icon,让icon和文字都居中显示
- [Rails]加强版的.gitignore 文件
- 名企招聘信息
- 排序二叉树BST的基本操作(2)前驱,后继,删除
- RGBa颜色 css3的Alpha通道支持
- less
- asp.net 在使用母版页的子页面cs后台代码中控制母版页中的登录控件显示
- java中堆和堆栈的区别
- Asp.net MVC 4 Html帮助类 II
- Android设备上i-jetty环境的搭建
- Asp.net MVC 4 Html帮助类 II
- 转:web前端面试题合集 (Javascript相关)(js异步加载详解)
- 锐捷面试 2014--武汉
- PHP校验ISBN码的函数
- 《JAVA与模式》之适配器模式