/*****BiTree.h头文件******/
#define MAXQSIZE 50
#include<iostream>
#include<cstring>
#include<sstream>
using namespace std;
typedef char ElemType;
typedef struct Node{
ElemType data;
struct Node *lchild, *rchild;
}BiTNode, *BiTree;
typedef struct Queue{
BiTree Base[MAXQSIZE];
int front, rear;
}BTQUEUE;
void InitBiTree(BiTree &BT);
void BiTreeCreate(BiTree &BT);
bool BiTreeEmpty(BiTree BT);
void TraverseBiTree(BiTree BT, int Mark);
int BiTreeDepth(BiTree BT);
int BiTreeCount(BiTree BT);
void ClearBiTree(BiTree &BT);
/********************功能实现文件BiTreeFunctions.cpp********************/
#include "BiTree.h"
#include<iostream>
#include<stdio.h>
using namespace std;
void InitBiTree(BiTree &BT)
{
BT = NULL;
}
void BiTreeCreate(BiTree &BT)
{
char ch;
cin >> ch;
getchar();
if (ch == '#')
{
BT= NULL;
}
else
{
BT = (BiTree)malloc(sizeof(BiTNode));
if (!BT)
exit(0);
BT->data = ch;
BiTreeCreate(BT->lchild);
BiTreeCreate(BT->rchild);
}
}
bool BiTreeEmpty(BiTree BT)
{
return BT == NULL;
}
void TraverseBiTree(BiTree BT, int Mark)
{
if (Mark == 1) //前序
{
if (BT != NULL)
{
cout << BT->data << " ";
TraverseBiTree(BT->lchild, Mark);
TraverseBiTree(BT->rchild, Mark);
}
}
else if (Mark == 2) //中序
{
if (BT != NULL)
{
TraverseBiTree(BT->lchild, Mark);
cout << BT->data << " ";
TraverseBiTree(BT->rchild, Mark);
}
}
else if (Mark == 3) //后序
{
if (BT != NULL)
{
TraverseBiTree(BT->lchild, Mark);
TraverseBiTree(BT->rchild, Mark);
cout << BT->data << " ";
}
}
else if (Mark == 4) //层序
{
BTQUEUE Q;
Q.front = Q.rear = 0;
BiTree p;
if (BT != NULL)
{
Q.Base[Q.rear] = BT;
Q.rear = (Q.rear + 1) % MAXQSIZE;
}
while (Q.front!=Q.rear)
{
p = Q.Base[Q.front];
cout << p->data << " ";
Q.front = (Q.front + 1) % MAXQSIZE;
if (p->lchild != NULL)
{
Q.Base[Q.rear] = p->lchild;
Q.rear = (Q.rear + 1) % MAXQSIZE;
}
if (p->rchild != NULL)
{
Q.Base[Q.rear] = p->rchild;
Q.rear = (Q.rear + 1) % MAXQSIZE;
}
}
}
else {
cerr << "Mark值无效!遍历失败!!" << endl;
}
}
int BiTreeDepth(BiTree BT)
{
if (BT == NULL)
return 0;
else
{
int depth1 = BiTreeDepth(BT->lchild);
int depth2 = BiTreeDepth(BT->rchild);
if (depth1 > depth2)
return depth1 + 1;
else return depth2 + 1;
}
}
int BiTreeCount(BiTree BT)
{
if (BT == NULL)
return 0;
else return BiTreeCount(BT->lchild) + BiTreeCount(BT->rchild) + 1;
}
void ClearBiTree(BiTree &BT)
{
if (BT != NULL)
{
ClearBiTree(BT->lchild);
ClearBiTree(BT->rchild);
delete BT;
BT = NULL;
}
}
/*********************主函数文件BiTree.cpp*********************/
#include<iostream>
#include<cstring>
#include<stdlib.h>
#include "BiTree.h"
using namespace std;
int main()
{
BiTNode *bt;
InitBiTree(bt);
BiTreeCreate(bt);
cout << "前序遍,递归实现:" << endl;
TraverseBiTree(bt, 1);
cout << endl;
cout << "中序遍,递归实现:" << endl;
TraverseBiTree(bt, 2);
cout << endl;
cout << "后序遍,递归实现:" << endl;
TraverseBiTree(bt, 3);
cout << endl;
cout << "层序遍历,递归实现:" << endl;
TraverseBiTree(bt, 4);
cout << endl;
cout << "二叉树的深度为:" << endl;
cout << BiTreeDepth(bt) << endl;
cout << "二叉树的结点数为:" << endl;
cout << BiTreeCount(bt) << endl;
return 0;
}
二叉树上的各种操作
最新推荐文章于 2022-06-26 17:05:15 发布