树的三种遍历以及求树高,叶子结点数,结点数(递归实现)
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef char ElemType;
//树的结点类型
typedef struct TreeNode{
ElemType data;
struct TreeNode *lchild, *rchild;
}BiNode,*BiTree;
//建树
void CreaetTree(BiTree *T)
{
ElemType ch;
scanf("%c", &ch);
if(ch=='#')
{
*T = NULL;
}
else
{
*T = (BiTree)malloc(sizeof(BiNode));
(*T)->data = ch;
CreaetTree(&(*T)->lchild);
CreaetTree(&(*T)->rchild);
}
}
//前序遍历
void PreTravel(BiTree T)
{
if(!T) return;
else
{
printf("%c", T->data);
PreTravel(T->lchild);
PreTravel(T->rchild);
}
}
//中序遍历
void InTravel(BiTree T)
{
if (!T) return;
else
{
InTravel(T->lchild);
printf("%c", T->data);
InTravel(T->rchild);
}
}
//后序遍历
void PosTravel(BiTree T)
{
if (!T) return;
else
{
PosTravel(T->lchild);
PosTravel(T->rchild);
printf("%c", T->data);
}
}
//树的深度
int depth(BiTree T)
{
if (!T) return 0;
else return (max(depth(T->lchild), depth(T->rchild)) + 1);
}
//叶子结点数
int count_leaves(BiTree T)
{
if (!T) return 0;
if (!T->lchild && !T->rchild)
return 1;
else
return count_leaves(T->lchild) + count_leaves(T->rchild);
}
//结点数
int count(BiTree T)
{
if (!T) return 0;
return count(T->lchild) + count(T->rchild)+1;
}
int main()
{
BiTree T;
CreaetTree(&T);
PreTravel(T);
printf("\n");
InTravel(T);
printf("\n");
PosTravel(T);
printf("\n");
printf("%d\n", depth(T));
printf("%d\n", count_leaves(T));
printf("%d\n", count(T));
}