存储结构
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
创建二叉树
//创建二叉树
Status CreateTree(BiTree *T)
{
char ch;
scanf("%c",&ch);
if(ch == '#') *T = NULL;
else
{
*T = (BiTNode *)malloc(sizeof(BiTNode));
if(!(*T))
{
printf("内存空间单元分配失败~\n");
return ERROR;
}
(*T)->data = ch;
CreateTree(&(*T)->lchild);
CreateTree(&(*T)->rchild);
}
return OK;
}
先中后序递归遍历二叉树
//先序遍历
void preOrder(BiTree T)
{
if(T)
{
printf("%c",T->data);
preOrder(T->lchild);
preOrder(T->rchild);
}
}
//中序遍历
void InOrder(BiTree T)
{
if(T)
{
InOrder(T->lchild);
printf("%c",T->data);
InOrder(T->rchild);
}
}
//后序遍历
void PostOrder(BiTree T)
{
if(T)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%c",T->data);
}
}
复制二叉树
//赋值二叉树
void Copy(BiTree T,BiTree *NewT)
{
if(T == NULL)
{
*NewT = NULL;
return;
}
else
{
*NewT = (BiTree)malloc(sizeof(BiTNode));
(*NewT)->data = T->data;
Copy(T->lchild,&(*NewT)->lchild);
Copy(T->rchild,&(*NewT)->rchild);
}
}
计算二叉树深度
//计算二叉树深度
int depth(BiTree T)
{
int m,n;
if(T==NULL) return 0;
else
{
m = depth(T->lchild);
n = depth(T->rchild);
if(m>n) return m+1;
else return n+1;
}
}
计算二叉树结点树
//计算二叉树结点数
int NodeCount(BiTree T)
{
if(T==NULL) return 0;
else return (NodeCount(T->lchild)+NodeCount(T->rchild)+1); //+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);
}
测试代码整合
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//创建二叉树
Status CreateTree(BiTree *T)
{
char ch;
scanf("%c",&ch);
if(ch == '#') *T = NULL;
else
{
*T = (BiTNode *)malloc(sizeof(BiTNode));
if(!(*T))
{
printf("内存空间单元分配失败~\n");
return ERROR;
}
(*T)->data = ch;
CreateTree(&(*T)->lchild);
CreateTree(&(*T)->rchild);
}
return OK;
}
//先序遍历
void preOrder(BiTree T)
{
if(T)
{
printf("%c",T->data);
preOrder(T->lchild);
preOrder(T->rchild);
}
}
//中序遍历
void InOrder(BiTree T)
{
if(T)
{
InOrder(T->lchild);
printf("%c",T->data);
InOrder(T->rchild);
}
}
//后序遍历
void PostOrder(BiTree T)
{
if(T)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%c",T->data);
}
}
//赋值二叉树
void Copy(BiTree T,BiTree *NewT)
{
if(T == NULL)
{
*NewT = NULL;
return;
}
else
{
*NewT = (BiTree)malloc(sizeof(BiTNode));
(*NewT)->data = T->data;
Copy(T->lchild,&(*NewT)->lchild);
Copy(T->rchild,&(*NewT)->rchild);
}
}
//计算二叉树深度
int depth(BiTree T)
{
int m,n;
if(T==NULL) return 0;
else
{
m = depth(T->lchild);
n = depth(T->rchild);
if(m>n) return m+1;
else return n+1;
}
}
//计算二叉树结点数
int NodeCount(BiTree T)
{
if(T==NULL) return 0;
else return (NodeCount(T->lchild)+NodeCount(T->rchild)+1); //+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,NewT;
printf("建立二叉树:");
CreateTree(&T);
printf("\n先序遍历:");
preOrder(T);
printf("\n中序遍历:");
InOrder(T);
printf("\n后序遍历:");
PostOrder(T);
printf("\n赋值二叉树......");
Copy(T,&NewT);
printf("\n先序遍历:");
preOrder(NewT);
printf("\n中序遍历:");
InOrder(NewT);
printf("\n后序遍历:");
PostOrder(NewT);
printf("\n计算二叉树深度:%d",depth(T));
printf("\n计算二叉树结点数:%d",NodeCount(T));
printf("\n计算二叉树叶子数:%d",LeafCount(T));
}
测试结果:
建立这样的一棵树