二叉树的创建与其递归遍历


//
//  二叉树的创建,遍历
//
//  用#表示当前的结点为空
//

///

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef char ElemType ;   // 元素类型
#define MaxSize 20    // 定义一个常量

typedef struct Node   // 二叉树的结点类型定义
{
	ElemType data ;   // 二叉树结点的内容那个
	struct Node * lchild ;  // 指向左孩子结点
	struct Node * rchild ;  // 指向右孩子结点
} Node ;

typedef struct BiTree  // 二叉树的类型定义 
{
	Node * head ;  // 二叉树的头结点
} BNode ;


// 先序遍历创建二叉树 递归实现
void CreateBiTree( Node ** t )   // 从结点(*t)开始遍历二叉树
{
	ElemType ch ;
	scanf("%c" , &ch ) ; // 输入结点的数据

	if( ch == '#' )  // 表示该结点为空
	{
		*t = NULL ;
		return ;
	}
	else  // 此结点不为空
	{
		Node * node = (Node*)malloc(sizeof(Node)) ;
		if( !node )
		{
			printf("申请内存失败!") ;
			exit(0) ;
		}
		node->data = ch ;
		node->lchild = NULL ;
		node->rchild = NULL ;
		*t = node ;
	}
	CreateBiTree( &(*t)->lchild ) ;  // 从左孩子开始递归遍历
	CreateBiTree( &(*t)->rchild ) ;	 // 从右孩子开始递归遍历
}

// 先序递归遍历二叉树
void FirstOrderTraverse( Node * t )
{
	if( t != NULL )
	{
		printf("%c " , t->data ) ;
		FirstOrderTraverse( t->lchild ) ;
		FirstOrderTraverse( t->rchild ) ;
	}
}

// 中序递归遍历二叉树
void InOrderTraverse( Node * t )
{
	if( t != NULL )
	{
		InOrderTraverse( t->lchild ) ;
		printf("%c " , t->data ) ;
		InOrderTraverse( t->rchild ) ;
	}
}

// 后序递归遍历二叉树
void PostOrderTraverse( Node * t )
{
	if( t != NULL )
	{
		PostOrderTraverse( t->lchild ) ;
		PostOrderTraverse( t->rchild ) ;
		printf("%c " , t->data ) ;
	}
}


// 输出二叉树的所有的叶子节点
void PrintLeafNode( Node * t )
{
	if( t != NULL )
	{
		if( t->lchild == NULL && t->rchild == NULL )
		{
			printf("%c " , t->data ) ;
		}
		PrintLeafNode( t->lchild ) ;
		PrintLeafNode( t->rchild ) ;
	}
}

// 输出每个结点在二叉树的层数
void PrintLevel( Node * t , int level )
{
	if( t )
	{
		printf("%c %d\n" , t->data , level ) ;
		PrintLevel( t->lchild , level + 1 ) ;
		PrintLevel( t->rchild , level + 1 ) ;
	}
}

// 测试
int main()
{
	BNode btree ;

	CreateBiTree( &btree.head ) ;

	FirstOrderTraverse( btree.head ) ;
	printf("\n") ;
	InOrderTraverse( btree.head ) ;
	printf("\n") ;
	PostOrderTraverse( btree.head ) ;
	printf("\n") ;
	PrintLeafNode( btree.head ) ;
	printf("\n") ;

	int level = 0 ;
	PrintLevel( btree.head , level ) ;

	return 0 ;
}
	
	



	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值