遍历二叉树的递归算法

 

目录

 

一、遍历二叉树的相关概念

二、四种遍历二叉树的方式

三、遍历二叉树的算法

四、遍历算法的分析


一、遍历二叉树的相关概念

1、遍历定义:顺着某 一条搜索路径巡访二叉树中的结点,使得每个结点均被访问一次,而且仅被访问一次(又称周游)。“访问”的含义很广,可以是对结点作各种处理,如:输出结点的信息、修改结点的数据值等,但要求这种访问不破坏原来的数据结构。

2、遍历目的:得到树中所有结点的一个线性排列。

3、遍历用途:它是树结构插入、 删除、修改、查找和排序运算的前提,是二叉树一切运算的基础和核心。

二、四种遍历二叉树的方式

1、先序遍历二叉树:

若二叉树为空,则空操作;否则

(1)访问根结点;(2)先序遍历左子树;(3)先序遍历右子树。

2、中序遍历二叉树

若二叉树为空,则空操作;否则

(1)中序遍历左子树;(2)访问根结点;(3)中序遍历右子树。

3、后序遍历二叉树

若二叉树为空,则空操作;否则

(1)后序遍历左子树;(2)后序遍历右子树;(3)访问根结点。

4、树的层次遍历,这种遍历方法必需用到队列,因为在访问根节点后,如果不将他的左右孩子入队,到时候访问右孩子时,就又要回到根节点来找到右孩子的地址,增加了时间复杂度。

三、遍历二叉树的算法

1、先序遍历二叉树的算法描述

Status PreOrderTraverse(BiTree T){

if(T==NULL) return OK; //空二叉树

else{

visit(T); //访问根结点,visit是一个函数例如其可以包含输出根节点printf("%d\t",T->data)。

PreOrderTraverse(T->lchild); //递归遍历左子树

PreOrderTraverse(T->rchild); //递归遍历右子树

}
  }

2、先序遍历二叉树的图形解释递归过程

遍历二叉树的递归算法_第1张图片

 3、中序遍历二叉树的算法描述

Status InOrderTraverse(BiTree T){

if(T==NULL) return OK; //空二叉树

else{

InOrderTraverse(T-> lchild); //递归遍历左子树
visit(T); //访问根结点;

InOrderTraverse(T-> rchild); //递归遍历右子树
   }
}

4、后序遍历二叉树的算法描述

Status PostOrderTraverse(BiTree T){

if(T==NULL) return OK; //空二叉树

else{

PostOrderTraverse(T->Ichild); //递归遍历左子树
PostOrderTraverse(T-> rchild); //递归遍历右子树
visit(T); //访问根结点

}
     }

四、遍历算法的分析

1、如果去掉输出语句,从递归的角度看,三种算法是完全相同的,或说这三种算法的访问路径是相同的,只是访问结点的时机不同。如下图所示:

遍历二叉树的递归算法_第2张图片

你可能感兴趣的:(树和二叉树,数据结构与算法,笔记,算法,数据结构,c++)