二叉树的先序、中序、后序非递归遍历(C++版)
2015-03-06 14:27
351 查看
//输入abd###c#e##
//输入abd#g###c#e##
#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]={0};
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();
}
}
int main()
{
//输入abd###c#e##
BiTree T;
CreateBiTree(T);
PreOrderTraverse(T);
printf("\n");
InOrderTraverse(T);
printf("\n");
PostOrderTraverse(T);
printf("\n");
return 0;
}
//输入abd#g###c#e##
#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]={0};
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();
}
}
int main()
{
//输入abd###c#e##
BiTree T;
CreateBiTree(T);
PreOrderTraverse(T);
printf("\n");
InOrderTraverse(T);
printf("\n");
PostOrderTraverse(T);
printf("\n");
return 0;
}
相关文章推荐
- C++实现二叉树的递归遍历与非递归遍历(先序、中序、后序、层序)
- 二叉树的前序、中序、后序、层序非递归遍历
- C++编写数据结构中的二叉树(前序,中序,后序遍历)
- 二叉树的非递归遍历(前序,中序,后序和层序遍历)
- [置顶] 数据结构——二叉树 前序、中序、后序、递归遍历和非递归遍历
- 二叉树的先序、中序、后序、层序递归及非递归遍历
- c/c++实现二叉树前序,中序和后序的递归和非递归遍历
- 二叉树的先序、中序、后序遍历等基本操作c++实现
- C++二叉树先序、中序、后序遍历
- C++二叉树的建立、前序、中序、后序遍历
- 二叉树基本操作的递归实现(二叉树建立,先序,中序,后序,深度的递归遍历。广度优先,高度优先的非递归遍历)
- c++实现二叉树的非递归创建以及非递归先序、中序、后序遍历
- 二叉树的非递归前序、中序以及后序遍历C++模版类实现
- C++实现链式二叉树,采用非递归的方式先序,中序,后序遍历二叉树
- 二叉树前序、中序、后序非递归遍历
- C++中的树、二叉树、二叉树遍历、二叉树前序、中序、后序遍历相互求法
- C/C++:二叉树的各种遍历(前序,中序,后序,层次)(一)
- Java, c++ 中序和前序 或 中序和后序构建二叉树
- [C/C++] 先序建立二叉树| 先序、中序、后序遍历二叉树| 求二叉树深度、节点数、叶节点数 算法实现
- 二叉树的先序、中序、后序遍历等基本操作c++实现