树的非递归遍历(中序遍历栈实现)
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef struct BNode {
char data;
struct BNode* lchild, * rchild;
}*BiTree, BNode;
typedef BiTree ElemType;
typedef struct {
ElemType data[MAX];
int top;
}SqStack;
void InitStack(SqStack& S)
{
S.top = -1;
}
int StackEmploy(SqStack &S) {
if (S.top == -1) {
return 1;
}
else {
return 0;
}
}
int Push(SqStack& S, BiTree e) {
if (S.top == MAX - 1) {
return 0;
}
S.data[++S.top] = e;
return 1;
}
int Pop(SqStack &S, BiTree &e) {
if (S.top == -1) {
return 0;
}
e=S.data[S.top--];
return 1;
}
void Init(BiTree &T){
T->data = '#';
T->lchild = NULL;
T->rchild = NULL;
}
BiTree Create(BiTree& T) {
char c;
scanf("%c", &c);
if (c == '#') {
T = NULL;
}
else {
T = (BiTree)malloc(sizeof(BNode));
T->data = c;
T->lchild = Create(T->lchild);
T->rchild = Create(T->rchild);
}
return T;
}
void inittree(BiTree T)
{
T->rchild = NULL;
T->lchild = NULL;
}
void InTraver(BiTree T) {
SqStack S;
InitStack(S);
BiTree p = T; BiTree q;
while (p || !StackEmploy(S)) {
if (p) {
Push(S, p);
p = p->lchild;
}
else {
Pop(S,q);
printf("%c", q->data);
p = q->rchild;
}
}
}
void InOrder(BiTree& T) {
if (T) {
printf("%c", T->data);
InOrder(T->lchild);
InOrder(T->rchild);
}
}
int main() {
BiTree T = (BiTree)malloc(sizeof(BNode));
Init(T);
T = Create(T);
//InOrder(T);
InTraver(T);
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef struct BNode {
char data;
int flag;//标记是否已经访问完左右子树
struct BNode* lchild, * rchild;
}*BiTree, BNode;
typedef BiTree ElemType;
typedef struct {
ElemType data[MAX];
int top;
}SqStack;
void InitStack(SqStack& S)
{
S.top = -1;
}
int StackEmploy(SqStack& S) {
if (S.top == -1) {
return 1;
}
else {
return 0;
}
}
int Push(SqStack& S, BiTree e) {
if (S.top == MAX - 1) {
return 0;
}
S.data[++S.top] = e;
return 1;
}
int Pop(SqStack& S, BiTree& e) {
if (S.top == -1) {
return 0;
}
e = S.data[S.top--];
return 1;
}
void Init(BiTree& T) {
T->data = '#';
T->lchild = NULL;
T->rchild = NULL;
}
BiTree Create(BiTree& T) {
char c;
scanf_s("%c", &c);
if (c == '#') {
T = NULL;
}
else {
T = (BiTree)malloc(sizeof(BNode));
T->data = c;
T->lchild = Create(T->lchild);
T->rchild = Create(T->rchild);
}
return T;
}
void inittree(BiTree T)
{
T->rchild = NULL;
T->lchild = NULL;
}
void InTraver(BiTree T) {
SqStack S;
InitStack(S);
BiTree p = T; BiTree q;
while (p || !StackEmploy(S)) {
if (p) {
Push(S, p);
p = p->lchild;
}
else {
Pop(S, q);
printf("%c", q->data);
p = q->rchild;
}
}
}
void preTraver(BiTree T) {//前序遍历
SqStack S;
InitStack(S);
BiTree p = T;
// printf("%c",T->data);
BiTree q;
while (p || !StackEmploy(S)) {
if (p) {
printf("%c", p->data);
Push(S, p);
p = p->lchild;
}
else {
Pop(S, q);
p = q->rchild;
}
}
}
void Traver(BiTree T) {//后序遍历
SqStack S;
InitStack(S);
BiTree p = T;
BiTree q;
while (p || !StackEmploy(S)) {
if (p) {
p->flag = 1;
Push(S, p);
p = p->lchild;
}
else {
Pop(S, q);
if (q->flag == 1) {//标记为1说明只访问完了左子树
q->flag= 2;
Push(S, q);
p = q->rchild;
}
else {
printf("%c", q->data);
p = NULL;
}
}
}
}
void InOrder(BiTree& T) {
if (T) {
printf("%c", T->data);
InOrder(T->lchild);
InOrder(T->rchild);
}
}
int main() {
BiTree T = (BiTree)malloc(sizeof(BNode));
Init(T);
T = Create(T);
InOrder(T);//递归中序
InTraver(T);//非递归中序
preTraver(T);//非递归前序
Traver(T);// 非递归 /后序
return 0;
}
输入的树是这个样子:
运行结果: