遍历二叉树
#include "pch.h"
#include <iostream>
#include <queue>
#include <stdlib.h>
#define MAX_TREE_SIZE 100
#define OK 1
#define ERROR -1
using namespace std;
typedef char Status;
typedef int TElemType;
typedef TElemType SqBiTree[MAX_TREE_SIZE];
SqBiTree bt;
typedef struct BiTNode {
TElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
//创建一个二叉树
Status CreateBiTree(BiTree &T) {
char ch;
scanf("%c", &ch);
if (ch == ' ')T = NULL;
else {
if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
}
//先序遍历二叉树
Status PreOrderTraverse(BiTree T, Status(*Visit)(TElemType)) {
if (T) {
if (Visit(T->data))
if (PreOrderTraverse(T->lchild, Visit))
if (PreOrderTraverse(T->rchild, Visit)) return OK;
return ERROR;
}
else return OK;
}
//输出函数
Status PrintElement(TElemType e) {
printf("%c", e);
return OK;
}
//中序遍历
Status InOrderTraverse(BiTree T, Status(*Visit)(TElemType)) {
if (T) {
if (InOrderTraverse(T->lchild, Visit))
if (Visit(T->data))
if (InOrderTraverse(T->rchild, Visit)) return OK;
return ERROR;
}
else return OK;
}
//后序遍历
Status PostOrderTraverse(BiTree T, Status(*Visit)(TElemType)) {
if (T) {
if (PostOrderTraverse(T->lchild, Visit))
if (PostOrderTraverse(T->rchild, Visit))
if (Visit(T->data))
return OK;
return ERROR;
}
else return OK;
}
//层次遍历二叉树
void LevelOrder(BiTree T) {
BiTree p = T;
//队列
queue<BiTree> queue;
//根节点入队
queue.push(T);
//队列不空循环
while (!queue.empty()) {
//对头元素出队
p = queue.front();
//访问p指向的结点
printf("%c ", p->data);
//退出队列
queue.pop();
//左子树不空,将左子树入队
if (p->lchild != NULL) {
queue.push(p->lchild);
}
//右子树不空,将右子树入队
if (p->rchild != NULL) {
queue.push(p->rchild);
}
}
}
int main()
{
BiTree T;
printf("请输入二叉树的元素:\n");
CreateBiTree(T); //创建一个二叉树
printf("先序遍历\n");
PreOrderTraverse(T, PrintElement); //先序遍历.
printf("\n");
printf("中序遍历\n");
InOrderTraverse(T, PrintElement);//中序遍历
printf("\n");
printf("后序遍历\n");
PostOrderTraverse(T, PrintElement);//后序遍历
printf("\n");
LevelOrder(T);
}