二叉树的遍历
二叉树的遍历是很常见的一种问题, 往常我们可以通过递归来实现二叉树的先序,中序以及后序的遍历操作, 但是将递归转化成非递归是件值得去思考的一件事, 接下来是具体实现
具体实现
二叉树的定义
//定义一个二叉链表
typedef struct Node {
char data;
struct Node* lchild;
struct Node* rchild;
}BitNode, *BiTree;
创建二叉树
//创建一个二叉树
void CreateBiTree(BiTree* T) {
char ch = 0;
scanf("%c", &ch);
if (ch == ' ') {
*T = NULL;
} else {
*T = (BiTree)malloc(sizeof(BitNode));
if (!(*T)) {
exit(0);
}
(*T)->data = ch;
CreateBiTree(&((*T)->lchild));
CreateBiTree(&((*T)->rchild));
}
}
销毁二叉树
//销毁二叉树
void Destroy(BiTree* T) {
if (*T) {
if ((*T)->lchild) {
Destroy(&((*T)->lchild));
}
if ((*T)->rchild) {
Destroy(&((*T)->rchild));
}
free(*T);
*T = NULL;
}
}
先序遍历二叉树
递归
//递归先序遍历二叉树
void PreOrderTraverse(BiTree T) {
if (T) {
printf("%2c", T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
非递归
//非递归先序遍历二叉树
void PreTraverse(BiTree T) {
//定义一个存放结点指针的栈
BiTree stack[MAXSIZE] = { NULL };
//初始化栈
int top = 0;
BiTree adjust = T;
while (adjust != NULL || top > 0) {
while (adjust != NULL) {
printf("%2c", adjust->data);
stack[top++] = adjust;
adjust = adjust->lchild;
}
if (top > 0) {
adjust = stack[--top];
adjust = adjust->rchild;
}
}
}
中序遍历二叉树
递归
//递归中序遍历二叉树
void InOrderTraverse(BiTree T) {
if (T) {
InOrderTraverse(T->lchild);
printf("%2c", T->data);
InOrderTraverse(T->rchild);
}
}
非递归
//非递归中序遍历二叉树
void InTraverse(BiTree T) {
BiTree stack[MAXSIZE] = { NULL };
int top = 0;
BiTree adjust = T;
while (adjust != NULL || top > 0) {
while (adjust != NULL) {
stack[top++] = adjust;
adjust = adjust->lchild;
}
if (top > 0) {
adjust = stack[--top];
printf("%2c", adjust->data);
adjust = adjust->rchild;
}
}
}
后序遍历二叉树
递归
//递归后序遍历二叉树
void PostOrderTraverse(BiTree T) {
if (T) {
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%2c", T->data);
}
}
非递归
//非递归后续遍历二叉树
void PostTraverse(BiTree T) {
BiTree stack[MAXSIZE] = { 0 };
int top = 0;
BiTree adjust = T;
BiTree before = NULL;
while (adjust != NULL || top > 0) {
while (adjust != NULL) {
stack[top++] = adjust;
adjust = adjust->lchild;
}
if (top > 0) {
adjust = stack[top - 1];
if (adjust->rchild == NULL || adjust->rchild == before) {
printf("%2c", adjust->data);
before = adjust;
adjust = NULL;
--top;
} else {
adjust = adjust->rchild;
}
}
}
}
测试
int main() {
BiTree t1;
CreateBiTree(&t1);
printf("\n*****************\n");
PreOrderTraverse(t1);
printf("\n*****************\n");
PreTraverse(t1);
printf("\n*****************\n");
InOrderTraverse(t1);
printf("\n*****************\n");
InTraverse(t1);
printf("\n*****************\n");
PostOrderTraverse(t1);
printf("\n*****************\n");
PostTraverse(t1);
printf("\n*****************\n");
Destroy(&t1);
if (!t1) {
printf("OK\n");
}
system("pause");
return 0;
}
效果图
希望本篇文章能对大家有所帮助, 真诚希望得到大家评论和建议