##c语言实现非递归中序遍历和先序遍历
Stack.h
//
// Created by Carry on 2021/10/26.
//
#ifndef EXAM_STACK_H
#define EXAM_STACK_H
#endif //EXAM_STACK_H
#define MaxSize 50
typedef struct BiTNode ElemType;
typedef struct {
ElemType data[MaxSize];
int top; //初始化为-1
} SqStack;
typedef struct Linknode{
ElemType data;
struct Linknode *next;
} *LiStack;
void InitStack(SqStack *S) {
S->top = -1;
}
int StackEmpty(SqStack S) {
if (S.top == -1) {
return 1;
} else {
return 0;
}
}
int Push(SqStack *S,ElemType *x){
if(S->top == MaxSize - 1){
return 0;
}
S->data[++S->top] = *x;
return 1;
}
int Pop(SqStack *S,ElemType *x){
if (S->top == -1) {
return 0;
}
*x = S->data[S->top --];
return 1;
}
int GetTop(SqStack *S,ElemType *x){
if (S->top == -1) {
return 0;
}
*x = S->data[S->top];
return 1;
}
Tree.c
//
// Created by Carry on 2021/10/25.
//
#include "stdio.h"
#include "stdlib.h"
typedef int Elemtype;
typedef struct BiTNode {
Elemtype data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
#include "Stack.h"
# 中序遍历
void InOrder2(BiTree T) {
SqStack s;
InitStack(&s);
BiTree p = T;
BiTree q = (BiTree) malloc(sizeof(BiTNode));
while (p || !StackEmpty(s)) {
if (p) {
Push(&s, p);
p = p->lchild;
} else {
Pop(&s, q);
printf("%d ", q->data);
p = q->rchild;
}
}
free(q);
}
#先序遍历
void PreOrder2(BiTree T) {
SqStack s;
InitStack(&s);
BiTree p = T;
BiTree q = (BiTree) malloc(sizeof(BiTNode));
while (p || !StackEmpty(s)) {
if (p) {
printf("%d ", p->data);
Push(&s,p);
p = p->lchild;
} else{
Pop(&s,q);
p = q->rchild;
}
}
}
int main() {
BiTree node1 = (BiTree) malloc(sizeof(BiTNode));
node1->data = 3;
BiTNode node2;
BiTNode node3;
BiTNode node4;
node2.data = 4;
node3.data = 8;
node4.data = 10;
node1->lchild = &node2;
node1->rchild = &node3;
node2.lchild = &node4;
node2.rchild = node3.lchild = node3.rchild = node4.rchild = node4.lchild = NULL;
PreOrder2(node1);
return 0;
}
输出结果: