代码要求
- 按先序序列构造一棵二叉链表表示的二叉树T;
- 对这棵二叉树进行遍历:先序、中序、后序以及层次遍历,分别输出结点的遍历序列;
输入要求
从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立)。
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;
}
}
}