二叉树的基本操作实现(包括先序、中序、后序遍历,以及层序遍历)

代码要求

  1. 按先序序列构造一棵二叉链表表示的二叉树T;
  2. 对这棵二叉树进行遍历:先序、中序、后序以及层次遍历,分别输出结点的遍历序列;

输入要求

从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立)。

1、首先,定义二叉树

#include<iostream>
using namespace std;
#define MAXSIZE 100
typedef struct BiTNode {
	char data;
	struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

2、然后定义一个队列的存储结构便于下面的层序遍历

typedef struct//队列的存储
{
	BiTree *base;//基地址
	int front;//头指针
	int rear;//尾指针
}SqQueue;

3、二叉树的初始化以及队列的初始化

void InitBiTree(BiTree &T) {
	T = NULL;
}
void InitQueue(SqQueue &Q)//初始化队列并给队列分配空间
{
	Q.base = new BiTree[MAXSIZE];//给队列分配最大存储空间
	if (!Q.base)
		exit(OVERFLOW);//判断是否分配成功
	Q.front = Q.rear = 0;//头尾指针赋值为0
}

4、二叉树层序遍历中的入队操作和出队操作

void EnQueue(SqQueue &Q, BiTree &T)
{
	if ((Q.rear + 1) % MAXSIZE == Q.front)//判断队列是否满
	{
		cout << "入队失败";
		exit(OVERFLOW);
	}
	Q.base[Q.rear] = T;//将二叉树根节点入队
	Q.rear = (Q.rear + 1) % MAXSIZE;//队尾指针加1
}
BiTree OutQueue(SqQueue &Q)
{
	BiTree T;//生成临时二叉树的新结点
	T = Q.base[Q.front];//将队头的值赋给T
	Q.front = (Q.front + 1) % MAXSIZE;//队头指针加1
	return T;//返回T
}

5、递归创建二叉树并以 ‘#’ 为结束符

void CreateBiTree(BiTree &T) {
	char ch;
	cin >> ch;
	if (ch == '#')//递归结束,建空树
		T = NULL;
	else
	{
		T = new BiTNode;
		T->data = ch;
		cout << "请输入" << ch << "的左孩子:";
		CreateBiTree(T->lchild);
		cout << "请输入" << ch << "右左孩子:";
		CreateBiTree(T->rchild);
	}
}

6、先序、中序、后序递归遍历二叉树

void InOrderTraverse(BiTree T) {//中序遍历
	if (T) {
		InOrderTraverse(T->lchild);
		cout << T->data << endl;
		InOrderTraverse(T->rchild);
	}
}
void BeforeOrderTraverse(BiTree T) { //先序遍历
	if (T) {
		cout << T->data << endl;
		BeforeOrderTraverse(T->lchild);
		BeforeOrderTraverse(T->rchild);
	}
}
void LastOrderTraverse(BiTree T) {//后序遍历
	if (T) {
		LastOrderTraverse(T->lchild);
		LastOrderTraverse(T->rchild);
		cout << T->data << endl;
	}
}

7、层序遍历二叉树,运用队列存储每一层的结点。n层每一个结点顺序出队并输出结点的数据,然后把该结点的左右孩子入队,直到队列为空。

void SeqOrderTraverse(BiTree T)//层序遍历
{
	SqQueue Q;//生成一个新队列Q
	InitQueue(Q);//分配存储空间
	EnQueue(Q, T);//将二叉树根结点入队
	while (Q.rear != Q.front)//当队头指针不等于队尾时循环
	{
		BiTree root = OutQueue(Q);//新生成一个二叉树等于队头数据域
		cout << root->data;//输出这个二叉树结点数据域
		if (root->lchild)//如果这个结点有孩子不为空,将这个结点的左孩子入队
			EnQueue(Q, root->lchild);
		if (root->rchild)//如果这个结点右孩子不为空,将这个结点的右孩子入队
			EnQueue(Q, root->rchild);
	}
}

8、主函数进行选择性操作二叉树

void main()//主函数
{
	BiTree T;//新生成一个二叉树根节点
	InitBiTree(T);//分配空间
	cout << "请先序输入二叉树T(#代表在空格字符)" << endl << "请输入根:";
	CreateBiTree(T);//先序遍历输入二叉树的值
	char  a;
	cout << "请输入需要执行的选项(输入0时结束)" << endl << "A先序输出   B中序输出   C后序输出   D层序输出" << endl;
	while (cout << "请输入:")
	{
		cin >> a;
		if (a == 'A')
		{
			cout << "先序输出:";
			BeforeOrderTraverse(T);//先序输出 
			cout << endl; 
		}
		else if (a == 'B')
		{
			cout << "中序输出:";
			InOrderTraverse(T);//中序输出
			cout << endl; 
		}
		else if (a == 'C')
		{
			cout << "后序输出:";
			LastOrderTraverse(T);//后序输出
			cout << endl;
		}
		else if (a == 'D')
		{
			cout << "层序输出:";
			SeqOrderTraverse(T);//层序输出
			cout << endl;
		}

		else if (a == '0')//输入0时结束
		{
			cout << "输入结束!" << endl;
			break;
		}
		else if (a<'A' || a>'D')
		{
			cout << "输入错误!请重新输入:" << endl;
		}
	}
}

下面为演示结果

在这里插入图片描述

  • 5
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值