由于在二叉树的非递归遍历中使用到了栈,所以要修改Stack.h中的代码
由
typedef int ElemType;//定义元素的类型
改为
typedef BiTreeNode ElemType;//定义元素的类型
1、BiTree.h
#pragma once
#include<stdio.h>
#define TRUE 1
#define FALSE 0
typedef int Status;//处理状态,TRUE 1,FALSE 0
typedef char BElemType;//定义元素的类型
typedef struct BiTNode{
BElemType date;
struct BiTNode *lchild, *rchild;
}BiTreeNode;
Status CreateBiTree(BiTreeNode* &T);
Status PrintElem(BElemType e);
//非递归中序遍历
Status InOrderTraverse(BiTreeNode *T,Status (* Visit)(BElemType e));
//非递归后序遍历
Status PreOrderTraverse(BiTreeNode *T, Status(*Visit)(BElemType e));
//非递归遍历二叉树
Status PostOrderTraverse(BiTreeNode *T, Status(*Visit)(BElemType e));
//递归中序遍历
Status Pre_Traverse(BiTreeNode *T, Status(*Visit)(BElemType e));
//递归后序遍历
Status In_Traverse(BiTreeNode *T, Status(*Visit)(BElemType e));
//递归遍历二叉树
Status Post_Traverse(BiTreeNode *T, Status(*Visit)(BElemType e));
//是否为空
Status Empty(BiTreeNode *T);
2、BiTree.cpp
#include<stdio.h>
#include<stdlib.h>
#include"Stack.h"
#include"BiTree.h"
Status CreateBiTree(BiTreeNode* &T) {
char c;
scanf("%c", &c);
if (c == '#') {
return FALSE;
}
if (T == NULL) {
T = (BiTreeNode *)malloc(sizeof(BiTreeNode));
T->lchild = NULL;
T->rchild = NULL;
}
T->date = c;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
return TRUE;
}
Status PrintElem(BElemType e)
{
printf("%c ", e);
return TRUE;
}
Status InOrderTraverse(BiTreeNode *T, Status(*Visit)(BElemType e)) {
SqStack s;
InitStack(s);
BiTreeNode * p = T;
while (p || !StackEmpty(s)) {
if (p) {
Push(s, *p);
p = p->lchild;
}
else {
BiTreeNode a;
Pop(s,a);
Visit(a.date);
p = a.rchild;
}
}
return TRUE;
}
Status PreOrderTraverse(BiTreeNode *T, Status(*Visit)(BElemType e)) {
SqStack s;
InitStack(s);
BiTreeNode * p = T;
while (p || !StackEmpty(s)) {
if (p) {
Push(s, *p);
Visit(p->date);
p = p->lchild;
}
else {
BiTreeNode a;
Pop(s, a);
p = a.rchild;
}
}
return TRUE;
}
Status PostOrderTraverse(BiTreeNode *T, Status(*Visit)(BElemType e)) {
return TRUE;
}
Status Pre_Traverse(BiTreeNode *T, Status(*Visit)(BElemType e)) {
if (T != NULL) {
Visit(T->date);
if (T->lchild != NULL) {
Pre_Traverse(T->lchild,PrintElem);
}
if (T->rchild != NULL) {
Pre_Traverse(T->rchild, PrintElem);
}
}
return TRUE;
}
Status In_Traverse(BiTreeNode *T, Status(*Visit)(BElemType e)) {
if (T != NULL) {
if (T->lchild != NULL) {
Pre_Traverse(T->lchild, PrintElem);
}
Visit(T->date);
if (T->rchild != NULL) {
Pre_Traverse(T->rchild, PrintElem);
}
}
return TRUE;
}
Status Post_Traverse(BiTreeNode *T, Status(*Visit)(BElemType e)) {
if (T != NULL) {
if (T->lchild != NULL) {
Pre_Traverse(T->lchild, PrintElem);
}
if (T->rchild != NULL) {
Pre_Traverse(T->rchild, PrintElem);
}
Visit(T->date);
}
return TRUE;
}
Status Empty(BiTreeNode *T) {
if (T == NULL) {
return TRUE;
}
else {
return FALSE;
}
}
3、TestMain.cpp
#include<stdio.h>
#include<stdlib.h>
#include"BiTree.h"
int main() {
BiTreeNode *b = NULL;
CreateBiTree(b);
printf("(1为Null,0不为Null)%d", Empty(b));
printf("\n非递归中序");
InOrderTraverse(b, PrintElem);
printf("\n非递归前序");
PreOrderTraverse(b, PrintElem);
printf("\n递归后序");
Post_Traverse(b, PrintElem);
}