实验要求:
1、前序遍历生成二叉树;
2、前序、中序、后序遍历上述生成的二叉树(使用递归);
3、使用非递归方式中序遍历二叉树;
4、输出二叉树的深度、节点个数。
#include<iostream>
#define TElemType char
#define ElemType BiTree
#define MAXSIZE 1000
using namespace std;
typedef struct BiTNode // 二叉树的二叉链表存储表示
{
TElemType data; // 结点的数据域
struct BiTNode* lchild, * rchild; // 左右孩子指针
}BiTNode, * BiTree;
typedef struct // 定义栈的结构体
{
ElemType st[MAXSIZE]; // 存储栈内元素 最大长度为MAXSIZE
int top; // 栈顶索引
}SqStack;
void CreateBiTree(BiTree& T) // 按先序顺序创建二叉树
{
char ch; // 临时储存输入的数据
cin >> ch;
if (ch == '#') // 递归结束 创建空树
{
T = NULL;
}
else // 递归创建二叉树
{
T = new BiTNode; // 为指针T创建一个BiTNode类型的结点
T->data = ch;
CreateBiTree(T->lchild); // 递归创建左子树
CreateBiTree(T->rchild); // 递归创建右子树
}
}
void PreOrderTraverse(BiTree T) // 前序遍历二叉树T的递归算法
{
if (T != NULL) // 若二叉树非空
{
cout << T->data << " "; // 访问根结点
PreOrderTraverse(T->lchild); // 前序遍历左子树
PreOrderTraverse(T->rchild); // 前序遍历右子树
}
}
void InOrderTraverse(BiTree T) // 中序遍历二叉树T的递归算法
{
if (T!=NULL) // 若二叉树非空
{
InOrderTraverse(T->lchild); // 中序遍历左子树
cout << T->data << " "; // 访问根结点
InOrderTraverse(T->rchild); // 中序遍历右子树
}
}
void PostOrderTraverse(BiTree T) // 后序遍历二叉树T的递归算法
{
if (T != NULL) // 若二叉树非空
{
PostOrderTraverse(T->lchild); // 后序遍历左子树
PostOrderTraverse(T->rchild); // 后序遍历右子树
cout << T->data << " "; // 访问根结点
}
}
void InitStack(SqStack& S)// 栈的初始化
{
S.top = -1; // 将栈顶指针置为 -1
}
bool StackEmpty(SqStack S) // 判断栈是否为空
{
if (S.top == -1)
{
return true;
}
return false;
}
void Push(SqStack& S, ElemType& e) // 顺序栈的入栈操作
{
if (S.top == MAXSIZE - 1) // 判断栈是否已满
{
cout << "栈满溢出" << endl;
}
else // 入栈操作
{
S.top++;
S.st[S.top] = e;
}
}
void Pop(SqStack& S, ElemType& e) // 顺序栈的出栈操作
{
if (S.top == -1) // 判断栈是否为空
{
cout << "栈空下溢" << endl;
}
else // 弹出栈顶元素
{
e = S.st[S.top];
S.top--;
}
}
void InOrderTraverse_(BiTree T) // 中序遍历二叉树T的非递归算法
{
SqStack S; // 创建一个栈
InitStack(S); // 初始化栈S
BiTree p = T; // 创建一个指针p指向T
BiTree q = new BiTNode; // 创建一个指针q 并使其指向BiTNode类型的结点
while (p || !StackEmpty(S)) // p非空 或者 栈非空(当p与栈都空时 结束循环)
{
if (p) // p非空
{
Push(S, p); // 根指针进栈
p = p->lchild; // 遍历左子树
}
else // p为空
{
Pop(S, q); // 弹栈
cout << q->data << " "; // 访问根结点
p = q->rchild; // 遍历右子树
}
}
}
int Depth(BiTree T) // 计算二叉树T的深度
{
int m, n;
if (T == NULL) // 如果是空树 深度为0 递归结束
return 0;
else
{
m = Depth(T->lchild); // 递归计算左子树的深度记为m
n = Depth(T->rchild); // 递归计算右子树的深度记为n
if (m > n) // 二叉树的深度为m与n的较大者加1
return m + 1;
else
return n + 1;
}
}
int NodeCount(BiTree T) // 统计二叉树T中结点的个数
{
if (T == NULL) // 如果是空树 则结点的个数为0 递归结束
return 0;
else // 否则结点个数为左子树的结点个数+右子树的结点个数+1
return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
}
void ShowList() // 展示选项
{
cout << "****************************************" << endl;
cout << "** -----二叉树的练习系统----- **" << endl;
cout << "** 1.前序遍历生成二叉树 **" << endl;
cout << "** 2.前序递归遍历生成的二叉树 **" << endl;
cout << "** 3.中序递归遍历生成的二叉树 **" << endl;
cout << "** 4.后序递归遍历生成的二叉树 **" << endl;
cout << "** 5.非递归方式中序遍历二叉树 **" << endl;
cout << "** 6.求二叉树的深度 **" << endl;
cout << "** 7.求二叉树的结点个数 **" << endl;
cout << "** 0.退出程序 **" << endl;
cout << "****************************************" << endl;
}
int main()
{
int select; // 临时储存选项
BiTree T = NULL; // 创建一个空树
while (1)
{
ShowList();
cout << "请输入您的选项:";
cin >> select;
if (select == 0) // 判断是否结束程序
break;
switch (select)
{
case 1:
cout << "请按照先序输入二叉树的元素: ";
CreateBiTree(T); // 先序遍历生成二叉树
cout << "输入成功! " << endl;
break;
case 2:
cout << "前序递归遍历输出二叉树: ";
PreOrderTraverse(T); // 前序递归遍历二叉树
cout << endl;
break;
case 3:
cout << "中序递归遍历输出二叉树: ";
InOrderTraverse(T); // 中序递归遍历二叉树
cout << endl;
break;
case 4:
cout << "后序递归遍历输出二叉树: ";
PostOrderTraverse(T); // 后序递归遍历二叉树
cout << endl;
break;
case 5:
cout << "中序非递归遍历输出二叉树: ";
InOrderTraverse_(T); // 中序非递归遍历二叉树
cout << endl;
break;
case 6:
cout << "二叉树的深度为: " << Depth(T) << endl;
break;
case 7:
cout << "二叉树的结点个数为: " << NodeCount(T) << endl;
break;
default:
cout << "请输入正确的选项!" << endl;
break;
}
system("pause");
system("cls");
}
return 0;
}