此程序使用纯C语言,本人对于指针中*、-〉、.等符号的运用不是很熟练,但是总归能够尝试,本程序亲测可行。
上一篇文章使用C++、C混合式进行编程出现了一些小问题,希望有大佬可以帮忙解决,我也会进行改进。
#include <stdio.h>
#include <stdlib.h>
typedef struct BiTNode {
char data;
struct BiTNode *lchild , *rchild;
} BiTNode,*BiTree;
typedef struct StackNode {
BiTNode *data;
struct StackNode *next;
} StackNode,*LinkStack;
void InitStack(LinkStack *S) {
*S=NULL;
}
void InitTree(BiTree *T) {
*T=NULL;
}
void Push(LinkStack *S,BiTNode *e) {
StackNode *p;
p=(StackNode *)malloc(sizeof(StackNode));
p->data=e;
p->next=*S;
*S=p;
}
BiTNode* Pop(LinkStack *S) {
if(!(*S)) {
printf("\n 链栈为空!");
exit(0);
}else{
StackNode *p=*S;
*S=(*S)->next;
return p->data;
}
}
//获得栈顶元素
BiTree GetTop(LinkStack S) {
if(S) return S->data;
}
//判断栈是否为空
int StackEmpty(LinkStack S) {
if(S) return 0;
else {
return 1;
}
}
void CreateBiTree(BiTree *T) {
char ch;
scanf("%c",&ch);
if(ch=='#') (*T)=NULL;
else {
(*T)=(BiTNode * ) malloc (sizeof(BiTree));
(*T)->data=ch;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
}
//递归遍历 先序
void ReTraverseFirst(BiTree T) {
if(T) {
printf("%c ",T->data);
ReTraverseFirst(T->lchild);
ReTraverseFirst(T->rchild);
}
}
//递归遍历 中序
void ReTraverseMiddle(BiTree T) {
if(T) {
ReTraverseMiddle(T->lchild);
printf("%c ",T->data);
ReTraverseMiddle(T->rchild);
}
}
//递归遍历 后序
void ReTraverseLast(BiTree T) {
if(T) {
ReTraverseLast(T->lchild);
ReTraverseLast(T->rchild);
printf("%c ",T->data);
}
}
//非递归操作 先序遍历
void InOrderTraverseFirst(BiTree T) {
LinkStack S;
InitStack(&S);
BiTNode *p=T;
while( p || !StackEmpty(S)) {
if(p) {
printf("%c ",p->data);
Push(&S,p);
p=p->lchild;
} else {
p=Pop(&S);
// printf("<出栈 %c> ",p->data);
p=p->rchild;
}
}
}
//非递归操作 中序遍历
void InOrderTraverseMiddle(BiTree T) {
LinkStack S;
InitStack(&S);
BiTNode *p=T;
while( p || !StackEmpty(S)) {
if(p) {
Push(&S,p);
p=p->lchild;
} else {
p=Pop(&S);
// printf("<出栈 %c> ",p->data);
printf("%c ",p->data);
p=p->rchild;
}
}
}
//非递归操作 后序遍历
void InOrderTraverseLast(BiTree T) {
LinkStack S;
InitStack(&S);
BiTNode *p;
BiTNode *r;
p=T;
r=NULL;
while( p || !StackEmpty(S)) {
if(p) {
Push(&S,p);
p=p->lchild;
} else {
p=GetTop(S);
if(p->rchild && p->rchild!=r){
p=p->rchild;
}else{
p=Pop(&S);
printf("%c ",p->data);
r=p;
p=NULL;
}
}
}
}
int main() {
BiTree T;
InitTree(&T);
printf("请输入先序序列的结点值:");//ABD##E##C#G##
CreateBiTree(&T);
printf("\n 递归先序遍历结果为:");
ReTraverseFirst(T); //递归遍历
printf("\n 递归中序遍历结果为:");
ReTraverseMiddle(T); //递归遍历
printf("\n 递归后序遍历结果为:");
ReTraverseLast(T); //递归遍历
printf("\n 非递归先序遍历结果为:");
InOrderTraverseFirst(T); //非递归遍历
printf("\n 非递归中序遍历结果为:");
InOrderTraverseMiddle(T); //非递归遍历
printf("\n 非递归后序遍历结果为:");
InOrderTraverseLast(T); //非递归遍历
return 0;
}
下附运行结果截图: