二叉树的基本操作
#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
typedef struct Tree
{
DataType data; //存储的数据域
// char data;
struct Tree *lchild; //指向当前节点的左孩子
struct Tree *rchild; //指向当前节点的右孩子
}BitTree;
BitTree *Create(BitTree *bt, int data[], int n);
void Inserter(BitTree **bt, int value);
void PerOrder(BitTree *bt);
void InOrder(BitTree *bt);
void PostOrder(BitTree *bt);
void CuculateNum(BitTree *bt, int *p);
void CuculateLeafNum(BitTree *bt, int *p);
int Cuculate_Leaf_Num(BitTree *bt);
void Destroy(BitTree *bt);
int maxDeep(BitTree *bt);
int a[]={3,2,5,8,4,7,6,9,10};
int main()
{
int num = 0;
int leaf = 0;
BitTree *BT = NULL;
// printf("\n创建二叉树:");
BT = Create(BT, a, 9);
printf("\n中序遍历输出:");
InOrder(BT);
printf("\n二叉树插入数据:");
Inserter(&BT, 1);
InOrder(BT);
CuculateNum(BT, &num);
printf("\n结点个数:%d ", num);
CuculateLeafNum(BT, &leaf);
printf("\n叶子节点个数:%d ", leaf);
int Leaf = Cuculate_Leaf_Num(BT);
printf("\n叶子节点个数:%d ", Leaf);
int deep = maxDeep(BT);
printf("\n深度:%d ", deep);
}
//建立二叉树初始化
void TreeInit(BitTree *bt)
{
bt->data = 0;
bt->lchild = NULL;
bt->rchild = NULL;
}
//(二级指针)----》递归创建
void CreateTree(BitTree **bt)
{
int data;
scanf("%c", &data);
if(data == '#')
{
*bt = NULL;
}
else
{
*bt = (BitTree *)malloc(sizeof(BitTree));
(*bt)->data = data;
CreateTree(&((*bt)->lchild));
CreateTree(&((*bt)->rchild));
}
}
//插入
void Inserter(BitTree **bt, int value)
{
BitTree *tmp, *parent;
tmp = (BitTree *)malloc(sizeof(BitTree));
tmp->data = value;
tmp->lchild = NULL;
tmp->rchild = NULL;
if(*bt == NULL)
{
*bt = tmp;
}
else
{
BitTree *head = *bt;
parent = head;
// while(head)
// {
// parent = head;
// //插入 先插到左节点上
// if(head->rchild != NULL)
// head = head->lchild;
// else
// head = head->rchild;
// }
// if(parent->lchild == NULL)
// parent->lchild = tmp;
// else
// parent->rchild = tmp;
//插入时进行排序
while(head)
{
parent = head;
//插入 先插到左节点上
if(tmp->data < head->data)
head = head->lchild;
else
head = head->rchild;
}
if(tmp->data < parent->data)
parent->lchild = tmp;
else
parent->rchild = tmp;
}
}
//二叉树的创建
BitTree *Create(BitTree *bt, int data[], int n)
{
for(int i = 0; i < n; i++)
{
Inserter(&bt, data[i]);
}
return bt;
}
//前序遍历===>中-左-右 ====》遍历全部加条件
void PerOrder(BitTree *bt)
{
if(bt)
{
printf("%d ",bt->data);
PerOrder(bt->lchild);
PerOrder(bt->rchild);
}
}
//中序遍历===>左-中-右
void InOrder(BitTree *bt)
{
if(bt)
{
InOrder(bt->lchild);
printf("%d ",bt->data);
InOrder(bt->rchild);
}
}
//后序遍历===>左-右-中
void PostOrder(BitTree *bt)
{
if(bt)
{
PostOrder(bt->lchild);
PostOrder(bt->rchild);
printf("%d ",bt->data);
}
}
//叶子结点个数
void CuculateNum(BitTree *bt, int *p)
{
if(bt == NULL)
{
return ;
}
else
{
(*p)++;
}
CuculateNum(bt->lchild, p);
CuculateNum(bt->rchild, p);
}
//统计叶子节点的数目 遍历全部统计需要的
void CuculateLeafNum(BitTree *bt, int *p)
{
if(bt == NULL)
{
return ;
}
if(bt->lchild == NULL && bt->rchild == NULL)
{
(*p)++;
}
CuculateLeafNum(bt->lchild, p);
CuculateLeafNum(bt->rchild, p);
}
int Cuculate_Leaf_Num(BitTree *bt)
{
if(bt == NULL)
{
return 0;
}
else if(bt->lchild == NULL && bt->rchild == NULL)
{
return 1;
}
return Cuculate_Leaf_Num(bt->lchild) + Cuculate_Leaf_Num(bt->rchild);
}
//树的深度
int maxDeep(BitTree *bt)
{
if(bt == NULL)
{
return 0;
}
int lDeep = maxDeep(bt->lchild);
int rDeep = maxDeep(bt->rchild);
int Deep = lDeep > rDeep ? lDeep + 1 : rDeep + 1;
return Deep;
}
//毁掉一棵树
void Destroy(BitTree *bt)
{
if(bt)
{
Destroy(bt->lchild);
Destroy(bt->rchild);
free(bt);
}
}