后序遍历二叉树实现表达式求值
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘
要: 本 文对 中缀表达式进 行扫描 , 借 助链 栈创 建二叉 树 , 后序遍 历二叉 树 实现表达 式求值 . 比传 统
表达式求值方 法有着更高的时 间和空间效率 , 尤其适用于同一表达式对 于多种赋值组合求 值的情况 , 如 判定逻辑表 达式 的类 型等 , 具有 一定 的实用价值 .
收 稿 日期 : 2 0 1 4 . 1 1 — 1 3
作 者简介 : 潘风 ( 1 9 8 l 一) , 女, 黑龙 江黑 河人 , 运城学 院计 算机科 学与 技术 系讲师 , 工学 硕士 , 主要 从事 网络技术 及应用 方
面 的研 究 .
山西 师 范 大 学 学 报 ( 自然 科 学 版 )
个结点 , 若二叉树非空第一个访问到的一定是个叶子结点 , 而此结点也一定是操作数 , 将此操作数压入到 操 作数 栈 , 然 后继 续遍历 ; 接 下来 访 问到 的结点 有两 种 可能 : 一 是 叶子 节 点 , 该结 点 为 操 作数 , 则 压 入 操作 数栈 ; 二是分支结点 , 则该节点定是运算符 , 判断该运算符是否是“ 非” 运算符“一 ” . 如果是 , 则操作数栈栈 顶元素出栈 , 作 为“ 一” 的右操作数进行运算 , 运算结果人栈 ; 如果不是 , 则操作数栈连续做两次出栈操作 , 将得到 的两个操作数分别作为运算符的右 、 左操作数进行运算 , 运算结果入栈. 然后继续遍历 , 重复上面的 操作 , 直到二叉树结点遍历完成 , 此时操作数栈 中的栈顶元素即为运算结果 , 将结果出栈 、 释放辅助空间,
组 存 储此 表 , 用 函数进 行 判断 两运 算符 的优先 关 系.
( 2 ) 构 建二 叉 树 .
>
>
>
>
< < < >
> Βιβλιοθήκη Baidu< < >
>
>
=
>
>
>
构建二叉树的过程中要用到两个与二叉树结点 类 型 相 同的 链 栈 , 一个用来 存放 运算符 , 称 为 算 符
栈; 一 个用 来 存放 操 作 数 , 称 为操 作 数 栈 . 首 先将 表
示 表 达式 开始 的“ # ” 压 人算 符栈 .
>
>
<
<
从 左 到 右依 次扫 描读 取逻 辑 表达 式 , 若 为 操作 数 , 则 创 建结 点后 压人 操作 数 栈 ; 若 为运 算符 , 则 与算 符 栈 的栈 顶 元 素进行 运 算优 先级 的 比较 , 若该 算符 的优 先级 相 对 高 , 则 创 建 结 点后 压 人 算符 栈 ; 若 该 算 符 的 优 先 级相 对低 , 则 算符 栈栈 顶元 素 结点 出栈. 操 作数 栈 栈 顶元 素 出栈 . 作 为 该 算 符栈 栈 顶 元 素结 点 的右 孩 子结点 , 若 该 运算 符为 双 目运算 符 , 则操 作 数栈 继续 出栈 , 作 为该 算 符结 点 的左 孩 子结 点 , 构 成 一 颗 子树 , 将 该 子树 的树 根结 点 压人 操作 数栈 . 该 算符 继续 与 算符 栈 的栈 顶 元 素 比较 优 先 级 . 重 复进 行 上 述 操作 , 直 到 遇 到表 征表 达式 结 束 的“ # ” , 至此 表 达式读 取 完毕 . 操 作数 栈 的栈顶 元 素 中所保存 的 即为 存储 了该 逻辑
山西师 范大学学报 ( 自然科学版 ) 第2 9卷第 2期
2 0 1 5年 6月
J o u r n a l o f S h a n x i No r ma l Un i v e r s i t y
Na t u r a l Sc i e n c e Ed i t i o n VoI . 29 No. 2
Ta b . 1 T h e t a b l e o f o p e r a t o r p r e c e d e n c e r e l a t i o n
( 1 ) 约定逻辑运算符运算优先关系. 如表 1 所示 , 列、 行 分 别表 示两 个 相继 出现 的算 符. 约定表 达 式 以“ # ” 开头 , “ # ” 结束 J , 可用 二 维数
一
表 达式 中的变 量赋 予 多组 不 同初值 的情 况 , 比如判 断 表达 式 的 类 型 、 求 解 表 达 式 的成 真 赋值 等 , 从 而 可
扩展 应用 到 逻辑 问题 解决 方 案 的求解 等 领域 中.
1 算法设计
运用 二叉 树 实现 表达 式求 值 需解 决 两 个 大 问题 : 表 达 式 的存 储 与 表 达式 求 值 . 本 文 约定 以逻 辑 运 算 为例 , 分别 用 “ &” 、 “ I ” 、 “一” 表示与、 或、 非 三种 逻辑 运算 . 第一 , 表 达式 存储 算 法设计 . 表 1 算符优先关系表
关键词 :中缀表达式 ; 后序遍历 ;表达式求值 中 图分类号 :T P 3 1 文献标识 码 : A
表达式求值是数据结构 中常见的问题 , 传统的求值方法效率较低. 本文 以逻辑运算为例 , 采用 二叉树 作为表达式的存储结构… , 对二叉树进行后序遍历来实现表达式求值 , 提高了运算效率. 尤其适用于对 同
J u n e 2 01 5
文章 编号 : 1 0 0 9 - 4 4 9 0 ( 2 0 1 5 ) 0 2 - 0 0 3 9 - 0 5
后 序 遍 历 二 叉 树 实 现 表 达 式 求 值
潘 凤
( 运城 学院计算机科 学与技术系 ,山西 运 城 0 4 4 0 0 0 )
2 0 1 5钲
表 达式 的二叉 树 的树根结 点 . 第二, 表 达式求 值算 法设计 . ( 1 ) 运算 规则 定义 . 对 三种 运算 的运 算 规则 加 以定义 , 如表 2所 示
表 2 析取运算规 则
T a b . 2 D i s j u n c t i v e o p e r a t i o n r u l e s
0 1
0 0
O 1
为“ 与” 运算的运算规则 , 其他运算类似. ( 2 ) 表达式求值.
求值 过程 中只需建 立一个 存放 操作 数 的栈 即可 . 首先 应 该 明确 一 点 : 在存 储 了表 达式 的二叉 树 中 , 操 作 数都 是 叶子结点 , 运算 符都 是分 支结 点. 后 序遍 历该 二叉 树 , 遵循“ 左~ 右一 中” 的顺 序访 问二叉 树 的各