头文件
树.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<string.h>
#include<assert.h>
#include<math.h>
typedef char Datatype;
typedef struct BTNode{
struct BTNode *pLeft;
struct BTNode *pRight;
Datatype data;
}BTNOde;
BTNOde*GreatTree(Datatype pre[], int size, int *pi)
{
if (*pi >= size)
return NULL;
if (pre[*pi] == '#')
{
(*pi)++;
return NULL;
}
BTNOde*pNode = (BTNOde*)malloc(sizeof(BTNOde));
assert(pNode);
pNode->data = pre[*pi];
(*pi)++;
pNode->pLeft = GreatTree(pre, size, pi);
pNode->pRight = GreatTree(pre, size, pi);
return pNode;
}
//前序
void Preorder(BTNode*pNode)
{
if (pNode == NULL){
return;
}
printf("%c ", pNode->data);
Preorder(pNode->pLeft);
Preorder(pNode->pRight);
}
//中序
void Inorder(BTNode*pNode)
{
if (pNode == NULL){
return;
}
Inorder(pNode->pLeft);
printf("%c ", pNode->data);
Inorder(pNode->pRight);
}
//后序
void reorder(BTNode*pNode)
{
if (pNode == NULL){
return;
}
reorder(pNode->pLeft);
reorder(pNode->pRight);
printf("%c ", pNode->data);
}
//求节点个数
int GetSize(BTNode *pNode)
{
if (pNode==NULL)
{
return 0;
}
//int n = 0;
//if (pNode->pLeft==NULL&&pNode->pRight==NULL)
return GetSize(pNode->pLeft) + GetSize(pNode->pRight) + 1;
}
//求叶子节点的个数
int GetLeafSize(BTNOde*pNode)
{
if (pNode == NULL)
return 0;
if (pNode->pLeft == NULL&&pNode->pRight == NULL)
return 1;
return GetLeafSize(pNode->pLeft) + GetLeafSize(pNode->pRight);
}
//求第K层上的节点个数
int GetLevelkSize(BTNOde*pNode,int k)
{
if (pNode == NULL)
return NULL;
if (k == 1)
return 1;
return GetLevelkSize(pNode->pLeft, k - 1) + GetLevelkSize(pNode->pRight,k-1);
}
//查找(判断一个data在不在一个树中)在,返回地址,不在,返回NULL,
BTNOde*Find(BTNOde*pRoot, Datatype data)
{
if (pRoot == NULL)
return NULL;
if (pRoot->data == data)
return pRoot;
BTNode*pNode = Find(pRoot->pLeft, data);
if (pNode != NULL)
{
return pNode;
}
return Find(pRoot->pRight, data);
}
//求树的高度
int deep(BTNOde*pNode)
{
if (pNode == NULL)
return 0;
int left = deep(pNode->pLeft);
int right = deep(pNode->pRight);
return ((left > right) ? left : right)+1;
}
//判断一棵树是否为完全二叉树
void ifall(BTNOde*pNode,int k)
{
if (pNode == NULL)
return;
float b = 2;
int pp = GetLevelkSize(pNode, k-1);
if (pp != (float)pow(b, k-1))
{
printf("否\n");
return;
}
ifall(pNode->pLeft,k+1);
ifall(pNode->pRight,k+1);
}
源文件
实例:
#include"树.h"
int main()
{
Datatype pre[] = "ABD##E##CF##G##";
int size = strlen(pre);
int pi = 0;
BTNode*pNOde = GreatTree(pre, size, &pi);
Preorder(pNOde);
printf("\n");
Inorder(pNOde);
printf("\n");
reorder(pNOde);
printf("\n");
printf("节点个数:%d\n", GetSize(pNOde));
printf("叶子节点个数:%d\n", GetLeafSize(pNOde));
printf("第K层节点个数:%d\n", GetLevelkSize(pNOde,2));
Datatype data = 'C';
BTNOde*pp = Find(pNOde, data);
//printf("%c的地址:%p\n",pp->data, pp);
printf("树的深度:%d\n", deep(pNOde));
int k = deep(pNOde);
ifall(pNOde,k);
system("pause");
return 0;
}