参考老师给的代码重新进行对二叉树的实现与操作(毕竟是老师出题,风格要跟他来)
这一次的二叉树是通过结点进行构建。
首先初始化二叉树,就是将根节点开辟一个结点空间,进行初始化。
然后按照先序序列创建二叉树则是通过递归左右子树进行构建,输入如果是 ‘#’,则表示为空结点,这样输入序列如果是 ab#c###,则表示为如下的二叉树
a
b
c
遍历二叉树就是通过递归方式进行先序遍历。
求二叉树的高度和结点数也是通过递归求解。
/*
BinTree Implementation
Author:zzj
Date:17-6-16
*/
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef char DataType;
typedef struct BitNode
{
DataType data;
struct BitNode *lchild, *rchild;//左右结点
}*BitTree;
/*初始化一个二叉树*/
void Init(BitTree &BT)
{
BT = (BitTree)malloc(sizeof(BitNode));
BT->data = NULL;
return;
}
/*按照先序次序建立二叉树*/
int BinTreeCreate(BitTree &BT)
{
char ch;
scanf("%c", &ch);
if(ch == '#') BT = NULL;
else{
BT = (BitTree)malloc(sizeof(BitNode));
BT->data = ch;
BinTreeCreate(BT->lchild);
BinTreeCreate(BT->rchild);
}
return 0;
}
/*判断二叉树是否为空*/
bool BinTreeEmpty(BitTree BT)
{
if(BT == NULL) return true;
return false;
}
/*先序遍历二叉树*/
void BinTraverse(BitTree BT)
{
if(BT == NULL) return;
printf("%c",BT->data);
if(BT->lchild != NULL)
BinTraverse(BT->lchild);
if(BT->rchild != NULL);
BinTraverse(BT->rchild);
}
/*求二叉树的深度*/
int BinTreeDepth(BitTree BT)
{
int depth;
if(BT)
{
int depthLeft = BinTreeDepth(BT->lchild);
int depthRight = BinTreeDepth(BT->rchild);
depth = 1 + max(depthLeft, depthRight);//树的深度取左子树和右子树中高度的最大值
}
else depth = 0;
return depth;
}
/*求二叉树中结点个数*/
int BinTreeCount(BitTree BT)
{
int cnt;
if(BT)
{
int cntLeft = BinTreeCount(BT->lchild);
int cntRight = BinTreeCount(BT->rchild);
cnt = cntLeft + cntRight + 1;//左子树的结点数加上右子树的结点数
}
else cnt = 0;
return cnt;
}
int main()
{
BitTree BT;
printf("1.初始化二叉树 2.按先序序列建立二叉树 3.判断二叉树是否为空.\n");
printf("4.先序遍历二叉树 5.求二叉树的深度 6.求二叉树结点的个数. 7.退出\n");
while(1)
{
int choose;
printf("请输入选择:");
scanf("%d", &choose);
if(choose == 7) break;
switch(choose)
{
case 1:
Init(BT);
break;
case 2:
getchar();//接收回车
BinTreeCreate(BT);
// printf("%c", BT->data);
break;
case 3:
if(BinTreeEmpty(BT)) printf("二叉树为空!\n");
else printf("二叉树不为空!\n");
break;
case 4:
printf("先序遍历二叉树序列如下:");
BinTraverse(BT);
printf("\n");
break;
case 5:
printf("二叉树的深度为 %d\n", BinTreeDepth(BT));
break;
case 6:
printf("二叉树的结点数为 %d\n", BinTreeCount(BT));
break;
}
}
return 0;
}