数据结构--遍历二叉树

遍历二叉树

#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);
}

猜你喜欢

转载自blog.csdn.net/weixin_43525993/article/details/84842720
今日推荐