遍历二叉树

利用先序、中序、后序、层次遍历二叉树

#include<iostream>
#include<malloc.h>
using namespace std;
#define MaxSize 1024

typedef struct Node {						//定义二叉链
	struct Node* lchild;					//指向左孩子节点
	char data;								//数据元素
	struct Node* rchild;					//指向右孩子节点 
}BTNode;									//struct Node 的别名						 

typedef struct Quene {						//定义顺序队 
	int front;								//队头指针 
	BTNode* data[MaxSize];					//存放队中元素 
	int rear;								//队尾指针 
}SqQueue; 									//struct Queue 的别名 

//初始化队列 
void initQueue(SqQueue*& q) {
	q = (SqQueue*)malloc(sizeof(SqQueue));	//分配一个空间 
	q->front = q->rear = -1;					//置 -1 
}

//判断队列是否为空
bool emptyQueue(SqQueue*& q) {
	if (q->front == q->rear) {					//首指针和尾指针相等,说明为空 
		return true;						//返回真 
	}
	else {
		return false;						//返回假 
	}
}

//进队列
bool enQueue(SqQueue*& q, BTNode*& BT) {
	if (q->rear == MaxSize - 1) {					//判断队列是否满了 
		return false;						//返回假 
	}
	q->rear++;								//头指针加 1 
	q->data[q->rear] = BT;					//传值 
	return true;							//返回真 
}

//出队列 
bool deQueue(SqQueue*& q, BTNode*& BT) {
	if (q->front == q->rear) {					//判断是否空了 
		return false;						//返回假 
	}
	q->front++;								//尾指针加 1 
	BT = q->data[q->front];					//取值 
	return true;							//返回真 
}

//创建二叉树 
int createBTNode(BTNode*& BT, char* str, int n) {
	char ch = str[n];								//把第 n 个字符赋给ch,方便后面判断 
	n = n + 1;
	if (ch != '\0') {								//如果 ch 不等于结束符就继续创建,否则就结束 
		if (ch == '#') {							//以 # 号代表 NULL,下面没有了 
			BT = NULL;
		}
		else {
			BT = new BTNode;					//新建一个二叉链 
			BT->data = ch;						//把字符存入二叉链 
			n=createBTNode(BT->lchild, str, n); 	//左递归创建 
			n=createBTNode(BT->rchild, str, n);	//右递归创建 
		}
	}
	return n;									//返回 n,记录字符串使用到哪里了 
}

//先序遍历
void preOrder(BTNode*& BT) {
	if (BT != NULL) {								//判断不为空 
		cout<<BT->data;					//访问根节点
		preOrder(BT->lchild);					//递归,先序遍历左子树 
		preOrder(BT->rchild);					//递归,先序遍历右子树 
	}
}

//中序遍历
void inOrder(BTNode*& BT) {
	if (BT != NULL) {
		inOrder(BT->lchild);
		cout<<BT->data;
		inOrder(BT->rchild);
	}
}

//后序遍历
void postOrder(BTNode*& BT) {
	if (BT != NULL) {
		postOrder(BT->lchild);
		postOrder(BT->rchild);
	    cout<<BT->data;
	}
}

//层次遍历 
void levelOrder(BTNode*& BT) {
	SqQueue* q;									//定义队列 
	initQueue(q);								//初始化队列 
	if (BT != NULL) {
		enQueue(q, BT);							//根节点指针进队列 
	}
	while (emptyQueue(q) != true) {					//队不为空循环 
		deQueue(q, BT);							//出队时的节点 
		cout<<BT->data;					//输出节点存储的值 
		if (BT->lchild != NULL) {					//有左孩子时将该节点进队列 
			enQueue(q, BT->lchild);
		}
		if (BT->rchild != NULL) {					//有右孩子时将该节点进队列 
			enQueue(q, BT->rchild);
		}										//一层一层的把节点存入队列 
	} 											//当没有孩子节点时就不再循环 
}


int main() 
{
	BTNode* BT;
	cout<<"输入字符串:";
	char* str = (char*)malloc(sizeof(char) * 1024);
	cin>>str;
	createBTNode(BT, str, 0);
	cout << "二叉树建立成功" << endl;;

	cout<<"先序遍历结果:";
	preOrder(BT);
	cout << endl;

	cout<<"中序遍历结果:";
	inOrder(BT);
	cout << endl;

	cout<<"后序遍历结果:";
	postOrder(BT);
	cout << endl;

	cout<<"层序遍历结果:";
	levelOrder(BT);
	cout << endl;

	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值