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

xiaoxiao2021-02-28  90

      最近在中国大学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; }

转载请注明原文地址: https://www.6miu.com/read-51293.html

最新回复(0)