二叉树遍历--递归实现

      递归这东西真是抽象,我看着看着算法,就囫囵吞枣地的写了下,写得囧了···

      这次先用递归实现先序,中序,后序遍历算法。先大概说下原理:我输入一大串字符,中间#就是代表了空,基本的储存结构就是二叉链表。主要就是二叉树的创建和三种顺序的遍历。二叉树的创建通过从左孩子开始创建不断递归,知道读取了#,开始创建对应的右孩子,继续递归。访问的时候对于三种顺序不过就是对于操作的顺序改变而已。

     对于下面的程序,按照图里面的二叉树建立方式:输入ABD#G###CE##FH###就建立了按图中的二叉树,然后会输出三种遍历顺序。

(以上图片来源http://blog.csdn.net/loomman/article/details/4027082

#include <stdio.h>
#include <Windows.h>

#define ElemType char

struct BiTree{
	ElemType num;
	struct BiTree *LeftChild;
	struct BiTree *RightChild;
};
typedef struct BiTree BiTreNode;
typedef BiTreNode* p_BitTree;

VOID PrintElement(ElemType e);
DWORD GetLastErrorBox(HWND hWnd, LPSTR lpTitle) ;
BOOL CreateBinary(p_BitTree* pBiTree);
BOOL PreOrderTraverse(BiTreNode* pBiTree,VOID(*Visit)(ElemType));
BOOL InOrderTraverse(BiTreNode* pBiTree, VOID(*Visit)(ElemType));
BOOL PostOrderTraverse(BiTreNode* pBiTree, VOID(*Visit)(ElemType));


int main()
{

	BiTreNode* T = NULL;
	VOID(*Operate)(ElemType);
	Operate = PrintElement;
	if (!CreateBinary(&T))						//create binary tree
	{
		printf("Create BinaryTree False\n");
		return 0;
	}

	printf("PreOrderTraverse:");				//PreOrderTraverse
	if (!PreOrderTraverse(T,Operate))
	{
		printf("Create BinaryTree False\n");
		return 0;
	}
	printf("\n");

	printf("InOrderTraverse:");					//InOrderTraverse
	if (!InOrderTraverse(T,Operate))
	{
		printf("Create BinaryTree False\n");
		return 0;
	}
	printf("\n");

	printf("PostOrderTraverse:");				//PostOrderTraverse
	if (!PostOrderTraverse(T,Operate))
	{
		printf("Create BinaryTree False\n");
		return 0;
	}
	printf("\n");
	return 0;
}

//创建二叉树
BOOL CreateBinary(p_BitTree* pBiTree)
{
	ElemType ch;
	ch = getchar();
	if (ch == '#')				//输入为#代表空
	{
		(*pBiTree) = NULL;
	}
	else
	{
		(*pBiTree) = (BiTreNode*)calloc(1,sizeof(BiTreNode));		//创建节点
		if (!(*pBiTree))
		{
			printf("Allocate Memory Error\n");
			return FALSE;
		}
		else
		{
			(*pBiTree)->num = ch;									
			CreateBinary(&(*pBiTree)->LeftChild);					//递归调用创建左子树
			CreateBinary(&(*pBiTree)->RightChild);					//递归调用创建右子树
		}
	}
	return TRUE;
}

//先序遍历二叉树
BOOL PreOrderTraverse(BiTreNode* pBiTree, VOID(*Visit)(ElemType))
{
	// 采用二叉链表存储结构,Visit是对数据元素操作的应用函数,
	// 先序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。
	if (pBiTree) 
	{
		Visit(pBiTree->num);
		PreOrderTraverse(pBiTree->LeftChild, Visit);
		PreOrderTraverse(pBiTree->RightChild, Visit);
		return TRUE;
	} 
	else 
	{
		return FALSE;
	}
} // PreOrderTraverse

//中序遍历二叉树
BOOL InOrderTraverse(BiTreNode* pBiTree, VOID(*Visit)(ElemType))
{
	if (pBiTree) 
	{
		InOrderTraverse(pBiTree->LeftChild, Visit);
		Visit(pBiTree->num);
		InOrderTraverse(pBiTree->RightChild, Visit);
		return TRUE;
	} 
	else 
	{
		return FALSE;
	}
} // InOrderTraverse

//后序遍历二叉树
BOOL PostOrderTraverse(BiTreNode* pBiTree, VOID(*Visit)(ElemType))
{
	if (pBiTree) 
	{
		PostOrderTraverse(pBiTree->LeftChild, Visit);
		PostOrderTraverse(pBiTree->RightChild, Visit);
		Visit(pBiTree->num);
		return TRUE;
	} 
	else 
	{
		return FALSE;
	}
} // InOrderTraverse

//对二叉树元素的操作
VOID PrintElement(ElemType e)
{  // 输出元素e的值
   printf("%c",e);
   return ;
}

// 显示错误信息  
DWORD GetLastErrorBox(HWND hWnd, LPSTR lpTitle)  
{  
	LPVOID lpv;  
	DWORD dwRv;  

	if (GetLastError() == 0) return 0;  

	dwRv = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |  
		FORMAT_MESSAGE_FROM_SYSTEM,  
		NULL,  
		GetLastError(),  
		MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),  
		(LPSTR)&lpv,  
		0,  
		NULL);  

	MessageBox(hWnd, (LPCSTR)lpv, lpTitle, MB_OK);  

	if(dwRv)  
		LocalFree(lpv);  

	SetLastError(0);  
	return dwRv;  
}  

    



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值