数据结构学习之-二叉树的三种递归遍历C++实现及相关应用

      最近在中国大学mooc上学习了数据结构课程,这周温习了二叉树相关的知识,现在将和二叉树三种遍历方法的原理以及C++实现基本的操作进行总结。二叉树的元素遍历主要有3种方式:前序遍历(根左右),中序遍历(左根右),后序遍历(左右根),三种遍历方式的主要区别在于访问根节点的顺序不一样。

一、三种遍历的基本实现C++实现

BinTree.h头文件实现:

#ifndef _BINTREE_H
#define _BINTREE_H
#include<stdlib.h>
#include<stdio.h>
//节点存储的数据类型
typedef int ElementType;

//二叉树节点的基本定义
typedef struct TreeNode* BinTree;
typedef BinTree Position;
struct TreeNode
{
	//节点存储的数据
	ElementType Data;
	BinTree Left;		//左边子树
	BinTree Right;		//右边子树
};

//遍历算法--递归实现
void PreOrderTraversal(BinTree BT);
void InOrderTraversal(BinTree BT);
void PostOrderTraversal(BinTree BT);

#endif
BinTree.cpp文件实现:

#include"BinTree.h"

//创建一个空的二叉树
BinTree CreateBinTree()
{
	BinTree tree = NULL;
	return tree;
}


//二叉树的先序遍历
//根 - 左 - 右
//递归实现
void PreOrderTraversal(BinTree BT)
{
	//如果该节点不为空
	if(BT)
	{
		printf("%d", BT->Data);				//先访问根节点
		PreOrderTraversal(BT->Left);		//循环遍历左子树
		PreOrderTraversal(BT->Right);		//循环遍历右子树
	}
}

//二叉树的先序遍历
//左 - 根 - 右
//递归实现
void InOrderTraversal(BinTree BT)
{
	if(BT)
	{
		InOrderTraversal(BT->Left);		//先循环遍历左子树
		printf("%d", BT->Data);				//访问根节点
		InOrderTraversal(BT->Right);		//循环遍历右子树
	}
}


//二叉树的后序遍历
//左 - 右 - 根
//递归实现
void PostOrderTraversal(BinTree BT)
{
	if(BT)
	{
		PostOrderTraversal(BT->Left);		//先循环遍历左子树
		PostOrderTraversal(BT->Right);		//循环遍历右子树
		printf("%d", BT->Data);				//访问根节点
	}
}

注意:三种遍历方式的主要区别在于访问根节点的顺序不同。


二、二叉树遍历的相关应用

//输出二叉树的中的根节点
void PreOrderPrintLeaves(BinTree BT)
{
	//树非空
	if(BT)
	{
		//左右节点都是NULL,则是叶子节点
		if(!BT->Left && !BT->Right)
			printf("%d", BT->Data);
		PreOrderPrintLeaves(BT->Left);
		PreOrderPrintLeaves(BT->Right);
	}
}


//输出二叉树的高度
int PostOrderGetHeight(BinTree BT)
{
	int HL, HR, MaxH;
	if(BT)
	{
		HL = PostOrderGetHeight(BT->Left);		//左树的深度
		HR = PostOrderGetHeight(BT->Right);		//右树的深度
		MaxH = (HL>HR)?HL:HR;					//左右子树较大的深度

		//这里的加1至关重要 -- 没有加则所有的深度都是0
		return (MaxH+1);						//返回树的深度
	}
	else    //空树
	 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值