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

来源:互联网 发布:linux 编译java 编辑:程序博客网 时间:2024/05/16 00:28

      最近在中国大学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至关重要 -- 没有加则所有的深度都是0return (MaxH+1);//返回树的深度}else    //空树 return 0;}

阅读全文
0 0