一、引言
本文给出了C语言版本的先序创建二叉树的递归算法。使用的示例二叉树如下图所示。
二、二叉树的创建之先序法-递归算法
按照算法的具体实现细节,要求对原二叉树的结点进行补充空结点。具体补充结果下图所示,其中黄色结点是二叉树的结点,蓝色结点是扩充的结点,扩充结点是为了能保证递归过程顺利结束。扩充的规则是单分支结点,用空字符补齐另外一分支,对树叶结点补双侧空字符。图(2)是图(1)的扩充结果。
1、算法的基本思路:
递归先序创建二叉树的思路很简单,类似先序遍历过程,首先创建树根结点,之后创建左子树,然后创建右子树结束。
详细的过程是:每读入一个非空元素,则立即作为当前子树的树根结点,然后以其为根创建左子树,此时进入递归过程,当遇到空结点时,结束该左子树的创建。左子树创建结束后再创建右子树,依然进入递归过程,当遇到空结点时,结束该右子树的创建。
按照图(2)所示,使用先序法创建二叉树,需要读入的数据依次为:
2、创建二叉树的代码:
#include"stdio.h"
#include"malloc.h"
#define CHAR
#define MAX_NODE 100
#ifdef CHAR
#define NULLKEY '?'
#else
#define NULLKEY 0
#endif
#ifdef CHAR
typedef char datatype;
#else
typedef int datatype;
#endif
typedef struct node
{
datatype data;
struct node *Lchild;
struct node *Rchild;
}BiTree;
/************************************************************************
//先序创建二叉树:递归算法。
//输入参数:无
//返回值: 树根
//说明:1.所有的叶子结点、分支不完整的结点,都要进行扩充,扩充方式为:
字符型结点:扩充‘?’
整型结点: 扩充‘0’,也可根据实际情况调整
2.在输入数据时,应该按照扩充后的二叉树的先序遍历序列进行输入
3.示例
a b d ? ? e g ? ? ? c ? f ? h ? ?
1 2 4 0 0 5 3 0 0 0 6 0 7 0 8 0 0
************************************************************************/
BiTree *CreatBiTtreePreorder_Recu()
{
BiTree *T;
datatype data;
#ifdef CHAR
scanf( "%c",&data );
getchar();//过滤空格或者换行符
#else
scanf( "%d",&data );
#endif
if( data == NULLKEY )
T = NULL;
else
{
T = ( BiTree * )malloc( sizeof( BiTree ) ) ;
T->data = data; //当前子树的树根
T->Lchild = CreatBiTtreePreorder_Recu() ;//创建当前树根的左子树
T->Rchild = CreatBiTtreePreorder_Recu() ;//创建当前树根的右子树
}
return( T );
}