APP下载
报价宝  ›  科技  › 

C语言:资料结构-二叉树的递回遍历演算法

报价宝 来源:baojiabao.com 发布时间:2019-07-18 13:52:00 09月11日更新
报价宝综合消息C语言:资料结构-二叉树的递回遍历演算法

二叉树遍历的概念

(1)遍历

二叉树的遍历是指按照一定次序访问树中所有结点,并且每个结点的值仅被访问一次的过程。

(2)遍历的三个子问题及三种访问方式

访问根结点,遍历左子树、遍历右子树先左后右,即先遍历左子树,再遍历右子树,并以根结点访问的次序划分先序、中序、后序先序遍历:先访问根结点,然后遍历左子树,再遍历右子树中序遍历:先遍历左子树,然后访问根结点,最后遍历右子树后序遍历:先遍历左子树,然后遍历右子树,最后访问根结点

先序遍历算法

void Preorder(struct BTreeNode* BT)

{

if(BT!=NULL) {

printf("%c",BT->data); /*访问根结点*/

Preorder(BT->left); /*先序遍历左子树*/

Preorder(BT->right); /*先序遍历右子树*/

}

}

中序遍历算法

void Inorder(struct BTreeNode* BT)

{

if(BT!=NULL) {

Inorder(BT->left); /*中序遍历左子树*/

printf("%c",BT->data); /*访问根结点*/

Inorder(BT->right); /*中序遍历右子树*/

}

}

后续遍历算法

void Postorder(struct BTreeNode* BT)

{

if(BT!=NULL) {

Postorder(BT->left); /*后序遍历左子树*/

Postorder(BT->right); /*后序遍历右子树*/

printf("%c ",BT->data); /*访问根结点*/

}

}

在这三种遍历算法中,访问根结点进行何种操作可视具体应用情况而定,这里暂以打印根结点的值代之。当然若结点的值为使用者定义的记录型别,则还必须依次输出结点值物件中的每个域的值。

递回遍历算法的执行过程

下面以中序递回遍历算法为例,结合图6-9的二叉树,分析其执行过程。

二叉树递回遍历举例

当从其他函式呼叫(此次称为第0次递回呼叫)中序遍历算法时,需要以指向树根A结点的指标Ap作为实参,把它传递给算法中的值参BT,呼叫递回算法时系统自动建立的工作栈应包括BT域和返回地址r域,假定进行第0次递回呼叫后的返回地址为r0,中序遍历左子树后的返回地址(即printf语句的开始地址)为r1,中序遍历右子树后的返回地址(即算法结束的地址)为r2,并假定指向每个结点的指标用该结点的值字尾小写字母p表示,如指向B结点的指标就用Bp表示,则每次进行递回呼叫时工作栈中的资料变化情况如图6-10所示。

二叉树中序递回遍历时工作栈的变化情况

由上述分析中序递回遍历算法的执行过程可知,结点的访问序列为:

C,B,D,A,E,G,F

类似地,若按照先序递回遍历算法和后序递回遍历算法遍历图6-9所示的二叉树,则结点的访问序列分别为:

A,B,C,D,E,F,G和C,D,B,G,F,E,A

递回遍历算法的时空复杂度分析

在二叉树的三种递回遍历算法中,都访问到了每个结点的每一个域,并且每个结点的每一个域仅被访问一次。所以三种递回遍历算法的时间复杂度均为O(n),n表示二叉树中结点的个数。另外在执行每个递回遍历算法时,系统都要使用一个栈,栈的最大深度等于二叉树的深度加1,而二叉树的深度视其具体形态决定,若二叉树为理想二叉树或接近理想二叉树,则二叉树的深度大致为log2n,所以其空间复杂度为O(log2n),若二叉树退化为一棵单支树(即最差的情况),则空间复杂度为O(n),n同样为二叉树中的结点数。
文章标签: 报价宝 降噪耳机价格 耳机价格 红米手机价格 华为手机价格 小米手机价格 电视机价格 笔记本电脑价格 笔记本价格 汽车价格 数码相机价格 笔记本价格 笔记本电脑价格 华为手机价格 红米手机价格