目录
一、功能函数(func.cpp)
二、声明文件(before.h)
三、主函数(main.cpp)
四、运行环境
一、功能函数(func.cpp)
#include <iostream>
#include "before.h"
using namespace std;
status CreateBiTree(BiTree &T)
{
char ch;
scanf("%c",&ch);
if(ch == '\n') return OK;
if(ch == '#') T = NULL;
else
{
T = (BiTree)malloc(sizeof(BiNode));
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}//先序遍历创建二叉树
status PreOrderTraverse(BiTree T)
{
if(T == NULL) return OK;
else
{
cout << T->data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}//先序遍历二叉树
status InOrderTraverse(BiTree T)
{
if(T == NULL) return OK;
else
{
InOrderTraverse(T->lchild);
cout << T->data;
InOrderTraverse(T->rchild);
}
}//中序遍历二叉树
status PostOrderTraverse(BiTree T)
{
if(T == NULL) return OK;
else
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout << T->data;
}
}//后序遍历二叉树
status LevelTraverse(BiTree T)
{
int MAX = CountNode(T);
BiTree Queue[MAX+1],e; //用一维数组表示队列
int front,rear;
front = rear = 0;
if(T)
{
Queue[rear++] = T; //根节点入队列
while(front != rear) //当队列非空
{
e = Queue[front++]; //队首元素出队列
cout << e->data;
if(e->lchild != NULL) Queue[rear++] = e->lchild;
if(e->rchild != NULL) Queue[rear++] = e->rchild;
}
}
}//层次遍历
status BiTreeDepth(BiTree T)
{
if(T == NULL) return ERROR;
else
{
int maxL = BiTreeDepth(T->lchild);
int maxR = BiTreeDepth(T->rchild);
return maxL>maxR ? (maxL+1):(maxR+1);
}
}//二叉树深度
status CountNode(BiTree T)
{
if(T == NULL) return ERROR;
else return CountNode(T->lchild)+ CountNode(T->rchild)+1;
}//二叉树总节点数
status Count0Node(BiTree T)
{
if(T == NULL) return ERROR;
else if(T->lchild == NULL && T->rchild == NULL) return 1;
else return Count0Node(T->lchild)+ Count0Node(T->rchild);
}//二叉树叶子节点个数
status Count1Node(BiTree T)
{
if(T == NULL) return ERROR;
else if((T->lchild == NULL && T->rchild != NULL) || (T->lchild !=NULL && T->rchild == NULL))
return Count1Node(T->lchild)+ Count1Node(T->rchild)+1;
else return Count1Node(T->lchild)+ Count1Node(T->rchild);
}//二叉树度为1的节点个数
status Count2Node(BiTree T)
{
if(T == NULL) return ERROR;
else if(T->lchild != NULL && T->rchild != NULL) return Count2Node(T->lchild)+ Count2Node(T->rchild)+1;
else return Count2Node(T->lchild)+ Count2Node(T->rchild);
}//二叉树度为2的节点个数
status ExchangeTree(BiTree &T)
{
BiNode *temp;
if(T == NULL) return OK; //结束递归
else
{
temp = T->lchild;
T->lchild = T->rchild;
T->rchild = temp;
ExchangeTree(T->lchild);
ExchangeTree(T->rchild);
}
}//交换左右孩子
BiTree CopyTree(BiTree T)
{
if(T == NULL) return NULL;
else
{
BiTree copyTree = T;
copyTree->lchild = CopyTree(T->lchild);
copyTree->rchild = CopyTree(T->rchild);
return copyTree;
}
}//复制二叉树
status IsSameTree(BiTree A,BiTree B)
{
if(A == NULL && B == NULL) return OK;
if(A == NULL || B == NULL) return ERROR;
if(A->data != B->data) return ERROR;
return IsSameTree(A->lchild,B->lchild) && IsSameTree(A->rchild,B->rchild);
}//比较两个二叉树是否相等
void Menu()
{
printf("\t\t\t************************此为二叉树的菜单***************************\n");
printf("\t\t\t\t1、创建二叉树 2、先序遍历二叉树 \n");
printf("\t\t\t\t3、中序遍历二叉树 4、后序遍历二叉树 \n");
printf("\t\t\t\t5、二叉树深度 6、二叉树总结点个数 \n");
printf("\t\t\t\t7、二叉树叶子个数 8、度为1的节点个数 \n");
printf("\t\t\t\t9、度为2的节点个数 10、交换左右孩子 \n");
printf("\t\t\t\t11、复制二叉树 12、比较两二叉树是否相等 \n");
printf("\t\t\t\t13、层次遍历二叉树 0、退出操作系统 \n");
printf("\t\t\t*****************************************************************\n");
}//调用菜单
//
//Created by somewon on 2022/11/8.
//
二、声明文件(before.h)
#ifndef _BEFORE_H
#define _BEFORE_H
#define OK 1
#define ERROR 0
#define OVERFLOW (-1)
typedef int status;
typedef char ElemType;
typedef struct BiNode
{
ElemType data;
struct BiNode *lchild;
struct BiNode *rchild;
}BiNode,*BiTree;
status CreateBiTree(BiTree &T); //先序遍历创建二叉树
status PreOrderTraverse(BiTree T); //先序遍历二叉树
status InOrderTraverse(BiTree T); //中序遍历二叉树
status PostOrderTraverse(BiTree T); //后序遍历二叉树
status LevelTraverse(BiTree T); //层次遍历二叉树
status BiTreeDepth(BiTree T); //二叉树深度
status CountNode(BiTree T); //二叉树总节点个数
status Count0Node(BiTree T); //二叉树叶子节点个数
status Count1Node(BiTree T); //二叉树度为1的节点个数
status Count2Node(BiTree T); //二叉树度为2的节点个数
status ExchangeTree(BiTree &T); //交换左右孩子
BiTree CopyTree(BiTree T); //复制二叉树
status IsSameTree(BiTree A,BiTree B); //比较两个二叉树是否相等
//菜单打印
void Menu();
#endif
//
//Created by somewon on 2022/11/8.
//
三、主函数(main.cpp)
#include <iostream>
#include "before.h"
using namespace std;
int main()
{
int ch;
int fine;
BiTree T;
BiTree L;
do {
Menu();
cout << "--请输入你的选择:";
cin >> ch;
switch (ch)
{
case 1:
T = NULL;
cout << "--请输入符合二叉树先序次序的字符串:";
getchar();
CreateBiTree(T);
cout << "当前二叉树T建立成功!其按先序输出为:" << endl;
PreOrderTraverse(T);
cout << endl;
break;
case 2:
cout << "当前二叉树T按先序输出为:" << endl;
PreOrderTraverse(T);
cout << endl;
break;
case 3:
cout << "当前二叉树T按中序输出为:" << endl;
InOrderTraverse(T);
cout << endl;
break;
case 4:
cout << "当前二叉树T按后序输出为:" << endl;
PostOrderTraverse(T);
cout << endl;
break;
case 5:
fine = BiTreeDepth(T);
if(T == NULL) cout << "当前二叉树T为空!" << endl;
else cout << "当前二叉树T的深度为:" << fine <<endl;
break;
case 6:
fine = CountNode(T);
if(T == NULL) cout << "当前二叉树T为空!无结点!" << endl;
else cout << "当前二叉树T的总结点个数为:" << fine << endl;
break;
case 7:
fine = Count0Node(T);
if(T == NULL) cout << "当前二叉树T为空!无叶子结点!" << endl;
else cout << "当前二叉树T的叶子结点个数为:" << fine << endl;
break;
case 8:
fine = Count1Node(T);
if(T == NULL) cout << "当前二叉树T为空!无度为1的结点!" << endl;
else cout << "当前二叉树T度为1的节点个数为:" << fine << endl;
break;
case 9:
fine = Count2Node(T);
if(T == NULL) cout << "当前二叉树T为空!无度为2的结点!" << endl;
else cout << "当前二叉树T度为2的结点个数为:" << fine << endl;
break;
case 10:
fine = ExchangeTree(T);
if(T == NULL) cout << "当前二叉树T为空!无法进行交换!" << endl;
else if(fine == OK)
{
cout << "当前二叉树T交换左右孩子成功!" << endl;
cout << "当前二叉树T按先序输出为:" << endl;
PreOrderTraverse(T);
cout << endl;
cout << "当前二叉树T按中序输出为:" << endl;
InOrderTraverse(T);
cout << endl;
}
break;
case 11:
BiTree S;
S = CopyTree(T);
if(S == NULL) cout << "当前二叉树T为空!无法进行复制!" << endl;
else
{
cout << "新建一个二叉树S成功!已复制二叉树T的值!" << endl;
cout << "新建成的二叉树S按先序输出为:" << endl;
PreOrderTraverse(S);
cout << endl;
cout << "新建成的二叉树S按中序输出为:" << endl;
InOrderTraverse(S);
cout << endl;
}
break;
case 12:
L = NULL;
cout << "--请输入符合二叉树L先序次序的字符串:";
getchar();
CreateBiTree(L);
cout << "创建新的二叉树L成功!二叉树L按照先序输出为:" << endl;
PreOrderTraverse(L);
cout << endl;
cout << "二叉树L按中序输出为:" << endl;
InOrderTraverse(L);
cout << endl;
fine = IsSameTree(T,L);
if(fine == ERROR) cout << "二叉树T和二叉树L不相等!" << endl;
else cout << "二叉树T和二叉树L相等!" << endl;
break;
case 13:
cout << "当前二叉树T层次遍历为:" << endl;
LevelTraverse(T);
cout << endl;
break;
case 0:
goto END;
default:
cout << "无该选项!" << endl;
}
}while(ch);
END:
cout << "结束当前程序成功!欢迎下次修改!" << endl;
return 0;
}
//
//Created by somewon on 2022/11/8.
//
四、运行环境
CLion