二叉树创建之先序法-递归算法

一、引言
本文给出了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 ); 
} 
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值