二叉树的数据结构中,例如构建一棵二叉树、遍历一棵二叉树、以及求一棵二叉树的高度或者结点总数,都可以运用到递归算法,递归算法一般比较简洁,便于理解,但也存在一定的缺陷,例如递归中很多计算都是重复的,由于其本质是把一个问题分解成两个或者多个小问题,多个小问题存在相互重叠的部分,则存在重复计算,如fibonacci斐波那契数列的递归实现。
不过这一篇先看看递归的,下一篇再谈谈非递归如何实现二叉树的创建、遍历等。
#include<stdio.h>
#include<stdlib.h>
#define Max 50
typedef struct BiTNode //二叉树结点结构体
{
char element; //数据域
struct BiTNode *lchild, *rchild; //指针域
}BiTNode, *BiTree; //定义一个指向struct BiTNode的指针
//先序构建二叉树(这里没有循环语句强调输入元素,但是函数为递归函数,结束的条件是输入的所有值为叶子结点)
void CreateBiTree(BiTree &T)
{
char ch;
ch = getchar();
if (ch == '#') //#代表空指针
T = NULL;
else
{
T = (BiTNode*)malloc(sizeof(BiTNode));
T->element = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
//先序输出二叉树(也是递归函数,结束的条件是输出最后一个结点)
void PreOrder(BiTree T)
{
if (T)
{
printf("%2c", T->element);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
//中序遍历输出二叉树
void InOrder(BiTree T)
{
if (T)
{
InOrder(T->lchild);
printf("%2c", T->element);
InOrder(T->rchild);
}
}
//后续遍历输出二叉树
void PostOrder(BiTree T)
{
if (T)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%2c", T->element);
}
}
//求二叉树的高度
int depth(BiTree T)
{
int dep1, dep2;
if (T == NULL)
return 0;
else
{
dep1 = depth(T->lchild);
dep2 = depth(T->rchild);
return dep1 > dep2 ? dep1 + 1 : dep2 + 1;
}
}
//求二叉树的叶子结点
int TreeSize(BiTree T)
{
if (!T)
return 0;
else
return TreeSize(T->lchild) + TreeSize(T->rchild) + 1;
}
void Clear(BiTree t) //清空二叉树
{
if (!t)
return;
Clear(t->lchild);
Clear(t->rchild);
free(t);
}
void main() {
int i, j;
BiTree T = NULL; //创建了一指针
printf("创建先序构建的二叉树:\n");
CreateBiTree(T);
printf("\n先序遍历的结果为:");
PreOrder(T);
printf("\n中序遍历的结果为:");
InOrder(T);
printf("\n后序遍历的结果为:");
PostOrder(T);
int height = depth(T);
printf("\n树高为:%d",height);
int acount = TreeSize(T);
printf("\n二叉树结点个数为:%d\n", acount);
}
结果如下: