#include<stdio.h>
#include<stdlib.h>
typedef struct BiTNode {
char data;
struct BiTNode* lchild;
struct BiTNode* rchild;
}BiTNode, * Bitree;
void Create_BinaryTree(Bitree* T)//递归创建二叉树
{
char c;
scanf("%c", &c);
fflush(stdin);
if (c == '#')
{
*T = NULL;
return;
}
else {
if (!(*T = (BiTNode*)malloc(sizeof(BiTNode))))
{
return;
}
(*T)->data = c;
Create_BinaryTree(&((*T)->lchild));
Create_BinaryTree(&((*T)->rchild));
}
}
void PreOrderTraverse(Bitree T)//先序遍历
{
if (T)
{
printf("%c", T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void InOrderTraverse(Bitree T)//中序遍历
{
if (T)
{
InOrderTraverse(T->lchild);
printf("%c", T->data);
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(Bitree T)//后序遍历
{
if (T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c", T->data);
}
}
void Copy(Bitree T, Bitree* NewT)//复制二叉树
{
if (T == NULL)
{
*NewT = NULL;
return;
}
else {
*NewT = (BiTNode*)malloc(sizeof(BiTNode));
(*NewT)->data = T->data;
Copy(T->lchild, &((*NewT)->lchild));
Copy(T->rchild, &((*NewT)->rchild));
}
}
int Depth(Bitree T)//计算二叉树深度
{
if (T == NULL)
{
return 0;
}
else {
int L = Depth(T->lchild);
int R = Depth(T->rchild);
return L > R ? L + 1 : R + 1;
}
}
int NodeCount(Bitree T)//计算二叉树总结点数
{
if (T == NULL)
{
return 0;
}
else {
return NodeCount(T->lchild) +
NodeCount(T->rchild) + 1;
}
}
int LeafCount(Bitree T)//计算二叉树叶子结点数
{
if (T == NULL)
{
return 0;
}
if (T->lchild == NULL && T->rchild == NULL)
{
return 1;
}
else {
return LeafCount(T->lchild) +
LeafCount(T->rchild);
}
}
int main()
{
Bitree T;
Create_BinaryTree(&T);
printf("先序遍历:");
PreOrderTraverse(T);
printf("\n");
printf("中序遍历:");
InOrderTraverse(T);
printf("\n");
printf("后序遍历:");
PostOrderTraverse(T);
printf("\n叶子节点数:%d\n总结点数:%d\n二叉树深度:%d", LeafCount(T),NodeCount(T),Depth(T));
printf("\n");
return 0;
}
二叉树部分基本操作的C语言递归实现
于 2023-05-24 22:59:20 首次发布