首页 百科知识 二叉树的应用

二叉树的应用

时间:2023-10-27 百科知识 版权反馈
【摘要】:若二叉树根结点不为空,则计数器count加1,然后依次递归统计T的左子树结点数和T的右子树结点数。若二叉树为空,则返回0;否则,递归统计左子树的深度,然后递归统计右子树的深度,递归结束后,返回其中较大的一个深度值,即是二叉树的深度。同样的道理,对该二叉树进行先序遍历和中序遍历,可以得到表达式的前缀表达式和中缀表达式。

6.5 二叉树的应用

本节介绍二叉树的基本应用,包括求二叉树的叶结点数、总结点数、二叉树的深度等,重点介绍标识符树的应用。

6.5.1 二叉树的基本应用

1.统计二叉树叶子结点数

(1)基本思想。若二叉树结点的左子树和右子树都为空,则该结点为叶子结点。可先对全局变量count+1,然后依次递归统计T的左子树叶子结点数和T的右子树叶子结点数。

(2)具体算法如下。

img269

2.求二叉树结点总数

(1)基本思想。若二叉树根结点不为空,则计数器count加1,然后依次递归统计T的左子树结点数和T的右子树结点数。

(2)具体算法如下。

img270

3.求二叉树的深度

(1)基本思想。若二叉树为空,则返回0;否则,递归统计左子树的深度,然后递归统计右子树的深度,递归结束后,返回其中较大的一个深度值,即是二叉树的深度。

(2)具体算法如下。

img271

img272

4.查找数据元素

在以T为根结点指针的二叉树中查找数据元素x。查找成功时返回该结点的指针;查找失败时返回空指针。

(1)基本思想。先判断二叉树的根结点是否与x相等,若相等则返回,否则,分别在T->lchild为根结点指针的二叉树中递归查找数据元素x,以及在T->rchild为根结点指针的二叉树中递归查找数据元素x。

(2)具体算法如下。

img273

6.5.2 标识符树与表达式

将算术表达式用二叉树来表示,称为标识符树,又称为二叉表示树。

1.标识符树的特点

(1)运算对象(标识符)都是叶结点。

(2)运算符都是根结点。

2.由表达式产生标识符树的方法

(1)读入表达式的一部分产生相应的二叉树后,再读入运算符时,将该运算符与二叉树根结点的运算符比较优先级的高低。

①若读入优先级高于根结点的优先级,则读入的运算符作为根的右子树,原来二叉树的右子树成为读入运算符的左子树。

②若读入优先级等于或低于根结点的优先级,则读入运算符作为树根,而原来二叉树作为它的左子树。

(2)遇到括号时,先使括号内的表达式产生一棵二叉树,再把它的根结点连接到前面已产生的二叉树根结点的右子树上去。

(3)单目运算符+、-,加运算对象θ(表示正负号)。

例如,-A表示为如图6-29所示的标识符树。

3.应用举例

【例6-7】 画出表达式A*B*C的标识符树(见图6-30),并求它的前序序列和后序序列。

img274

图6-29 标识符树

img275

图6-30 例6-7的标识符树

(1)其前序序列为:**A B C

(2)其后序序列为:A B*C*

【例6-8】 画出表达式A*(B*C)的标识符树(见图6-31),并求它的前序序列和后序序列。

(1)其前序序列为:*A*B C

(2)其后序序列为:A B C**

【例6-9】 画出表达式-A+B-C+D的标识符树(见图6-32),并求它的前序序列和后序序列。

(1)其前序序列为:+-+-θA B C D

(2)其后序序列为:θA-B+C-D+

img276

图6-31 例6-8的标识符树

img277

图6-32 例6-9的标识符树

img278

图6-33 例6-10的标识符树

【例6-10】 画出表达式(A+(B-C))/((D+E)*(F+G-H)的标识符树(见图6-33),并求它的前序序列和后序序列。

(1)其前序序列为:/+A-B C*+D E-+F G H

(2)其后序序列为:A B C-+D E+F G+H-*/

从上面的几个例子可知,只要将算术表达式用标识符树来表示,然后再求出它的后序遍历的序列,就能方便地得到原表达式的后缀表达式,这一结果和利用堆栈求得的后缀表达式的结果是完全一致的。

同样的道理,对该二叉树进行先序遍历和中序遍历,可以得到表达式的前缀表达式和中缀表达式。其中,中缀表达式就是通常使用的算术表达式,前缀表达式和后缀表达式分别称为波兰式和逆波兰式,它们在编译程序中有着非常重要的作用。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈