由遍历序列构造二叉树的非递归算法实现

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
fr = ; n m; + 0( 0i u i ) i < +
saf” ” n i ; cn(%c, D[ ) &I ]
 ̄uhs i) s ( dn; t
pit ” 输X- Y 树后 序序 列\”: r f请 n( - . f) 1
fr = ; n m; + o( 0i u i ) i < +

} 3 结论
在 以上算 法 中基本 操作 应 为 whl i e循环 嵌套 ,内层 第一 个 w i hl 环每 循环 一 次 ,i的值 减 1 内层 e循 .
的第 二个 whl 环 每循 环一 次 ,j的值 减 1 i e循 .外层 的 whl 环 和 内层 的两个 whl i e循 i e循环 的循 环次 数之 和为 2 .因而 算法 的 时间复 杂度 为 2 ,是 0 n ( 性 阶) .注意 到每 个解 决该 问题 的算 法 都必须 读 中 n n () 线 的 序遍 历和 后序遍 历 的 结点序 列至 少各 一遍 ,才 能 构造 出二 叉树 ,因而 时 间复杂度 至 少为 2 ,所 以本 算法 n
{ P ( iremalcs e f i N d ) B T e) l (i o( T o e) o z B ; P> aa P D[ ; 一d t= o i ] q>c i = ;/ -lhl p /q的左 孩子 为 P D[ d o i ] }
e s - c l=NULL; leq >lhi d
收 稿 日期 :2 0 . - 1 0 90 1 4 作 者简 介 :刘璐 (9 2) 女 , 北饶 阳县 人, 17 一, 河 衡水 学院 数 学与计 算机 学 院副 教授 , 工学硕 士
衡 水 学 院学 报
第 1 卷 1
借助 的工具包 括两个 一维字 符数 组 ID 和 P D 和 一个栈 Sak n o t ,方法 是将 中序遍 历序 列和后 序遍 历序列 c 分别存放 在一 维字符 数组 ID 和 P D 中,利用 栈 Sa k所 具有 的 “ 进先 出 ”的运 算特 点构 造 出二又树 n o tc 后 的二叉 链表 .算法 思想 如下 : 由后序序 列 的定义 可 知 ,后 序序 列 的最后 一个 结 点必定 为根 结点 ,据此 首 先确 定该二 叉树 的根 结点 为 F ,由中序 序列 的定 义可 知 ,中序遍 历序 列 中的最 后一个 结 点必 定是该 二又
求算法 的时空效率 ,必须 将递归算 法转化 为非递化 算法 ,问题 才能得到有 效解 决,本文设计 了一个非递 归算法 ,输入一
棵- - -4树 的 中序遍 历和后序 遍历的结点序列 ,构造 出该二 叉树 ,该算法对于一棵有 n 个结点的二叉树 ,具有 O(1 - n时间复
杂度 ,是解 决该 问题 的最优 算法.
就给 用户编 制程 序和 调试程 序 带来 了很大 的方便 ,而 且用 递 归算法 使
程 序 结构 清 晰 ,程 序 的 易读 性 较 好 ,其 正 确 性 也 容 易得 到 证 明 .但 是 ,递 归过程 的运行 效率 比较低 ,相 对于 非递 归过程 来说 ,递 归过程
更 耗时 ,空 间上 的需 求也 更大 .如果 在程序 中用 等效 的非 递 归过程 来
whl( = i j 0&& ID[ Saktp-d t、 e> n j = tc [ ] a ] o > a q> c i = UL ;q的左孩 子 为空 l l N L/ hd / q Saktp; p -- = t [ ]o -.一 c o t j; }
i i= j= ) f > 0l > 0 『
第 1 卷 第 4期 1 20 0 9年 8月
衡 水 学 院 学 报
J u n l f n s u i e st o r a g h i o He Un v ri y
V o .11 N O. 1 . 4 Aug. 09 20
由遍历序 列构造 二叉树 的非递 归算法 实现
和 后 序遍 历 的结 点序 列 ,可 以构 造 出这 棵 二叉 树 .但 多数 相 关文 献 中介 绍 的构造 方 法 都是 递 归过程 .本 文 中设计 了一个 非递 归算 法 ,该 算 法通 过 巧妙 地控 制 输入 的结 点序列 和 利用 栈 ,使 该算 法 的 时间复 杂度
为0 n .可 以证 明该算 法是解 决 以上 问题 的最 优 算法 . ()
/ / 约定 二叉树 中 结点 的数 据类 型为字 符型

s ut iNo e c i , c i ;/ 右孩子 指针 t c B T d lhl rhl / r d d 左 v i i( od n) ma

c a D[ x Te_ ie; hr n Ma _ re Sz] I / / 存放 中序遍 历 结点序 列 的数 组
结 点 I不是 其双 亲 结点 ,说 明其 有左 孩 子 ,左孩 子 为后序 序 列 中扫 描 到 的下一 个 结点 H,重 复 以上过 程 ,直 至所有 结点链 接完 为止 . 以下用 C语言给 出该算法 :
# e n x Te ie10 / 设二 叉树 结点数 不超过 1 0 df e i Ma re Sz 0 0/ 假 00
/o i] / D[ 1的右 孩子 为 P D[ P 一 o i ]
Saktp -rhl= L ; /P D[ 的右孩 子 为 空 tc [ ] c i NU L / o i o > d ]
i J - 一; ; ‘ -
q Sakt ]o 一 = tc [ p ; p ; o t

/ 栈 / 退
右子 树 的右 子树 的根 结 点,… 并且相 邻 结点之 间满 足后进 栈 的结 点是先 进栈 的结点 的右孩 子这 一特 点 ,
按这 一特 点将 扫描 到 的结 点沿右孩 子 指针域链 接完 成 ,直至找 到 J时 ,置其 右孩 子指 针域 为空 ;而左孩 子 的确定 则要判 定其 在 中序 序 列 中的前一 个结 点是 否是其 双 亲结 点 ,若是 ,说 明其无 左孩 子 ,否则 ,说 明其有左 孩 子 ,左孩 子应 是后序序 列 中扫描 到 的下 一个 结点 ,对 J而 言 , 由于其 在 中序序列 中的前一个
fuhs i) ls( dn; t
 ̄uhs i) s ( dn; t
ቤተ መጻሕፍቲ ባይዱ
/ / 存放 ’’ 栈底 ≠ ≠
pit ” r f 请输入 二叉 树结 点数\”; n( n) / 空输入 缓冲 区 / 清
sa f %d , uI; cn( . ” . &n I) 1
pi f 请输入 二叉树 中序 序列\”: r t” n( I) l
序列 ,它们 亦 分别 是左 、右 子树 的后 序序 列 ;
4 对 左 、右 子 树 的 中序 序 列 和 后 序 序 列 递 归 地 实 施 同样 的 方 ) 法 ,直至左 、右子树 为空 时终止 . 显然这 是一个 递 归过程 ,不难 编 写其递 归算法 .使 用递 归算 法编
程 时,不需 要用 户来 管理递 归工作 栈 ,而 是 由系统 自动 来 管理 的 ,这

( 水学院 衡

衡水 030 ) 500
数 学 与 计 算 机 学 院 ,河 北
摘 要 :二叉树的构造有多种方法,给出一棵二叉树的中序序列和后序序列,可以构造 出这棵二又树,但一般采用递归
算法.尽 管递归算法具有 结构 简炼 、清晰 、可读 性强等优点 ,但递 归算法在执行 过程会耗 费太多的 时间和空间 ,为 了追
代 替递 归调用 ,就可 以减 少程序 的运 行 时间和对 空 间的需 求 ,从而提
图 1 二 叉 树
高程序 的运行效率 . 2 非递 归构 造算 法 以 图 1所 示二 叉树 为例 ,其 中序 遍历序 列 为 A B GF J DE C HI,后序遍 历 序列 为 AD B I J ;算法 C GEH F
/ tc / ak是栈 S
/ / 所构造 二叉树 的根 指针 T是
p ( T e) l cs ef iNo e) /申请新 的结 点空 间 =Biremal ( zo( T d ) / o i B ;
p> a = ; -d t ’’ a
≠是不会 出现 在二叉 树 中的符 号 } ’
tp 0Saktp= ; o= ;tc[ ]p o
刘 由 历 列构 叉 的 递 算 实 璐 遍 序 造二 树 非 归 法 现
l I T指 向根结 点
3 9
whl i= j = ) i ( 0l> 0 e> l tp + Sakt ]p /P D[ 进栈 o + ; tc [ p= ; / o i o ] whl(o i= n j) i P D[ !ID[ e ] ]
树 中最右下 的结 点,在存 放 中序 序列 的数组 ID 中找 到最后 一个 结点 J n ,可知 其为 当前二 叉树 中最右下 的结 点 ,沿 二又树 的后序 序列 自后 向前依次 扫描 ,查找 与 J相 同的结点 ,将 扫 描到 的结 点依次存 入栈式
结构 Sak tc ,则 F 、J依次进 栈 ,这 些结 点分 别是二 叉树 的根 结点 ,根结 点的右 子树 的根结 点 ,根结点 的
c a o [ x Te— ie; hr D Ma— re Sz] P
N 存放 后序 遍历 结点序 列 的数组
BT d SakMa— reSz] iNoe tc[ x Te— i ; e
it, u tp n , m, ; in j o
B T d p , ; iNo e , qT

i- -;
p ( irema o (i o( iNo e) =B T e) l cs e f T d); l z B
p> aa P D[; -d t= o i ]
Saktp一rhl= ; tc [ ] c i p o > d tp + Saktp= ; o + ; tc [ ]p o }
sa f %c, o i ; cn( ” ” &P D[) ]
in m一; I m一; = u 1 =l 1 j u
p ( Te) l cs ef iNoe) =Biremal (zo( T d) o i B ;
P> a = o [ ; 一 dt P D i a ]

Tp =; {
关键 词 : 中 序遍历;后序遍历;二叉树
中 图分类 号 :T 1 P 0. 3 6
文献 标识 码 :A
文章 编号 :17.05 09 4 070 63 6( 0 ) — 3. 2 2 00 4
二叉 树 ( n r re 结构 是 一种 有 规律 的典型 的 非线 性 结构 ,也是 算 法设 计 中提 到 的一种 非 常重 要 Bia T e) y 的数据 结 构 ,有着 广 泛 的实 际应 用 .在 数据 结 构 的教 学 中 ,常常 遇 到这 样 的 问题 :给 出一棵 二 叉树 的 中 序 遍 历和 后序 遍历 的 结点序 列 ,用 人工 构造 出这棵 二叉 树 ,K uh n t 证 明 了:给 出一 棵 二叉树 的中序遍 历
1 递 归构 造方 法
由中序序 列和 后 序序 列 的定 义可 知 ,后序 序列 的最后 一 个 结点 必定 为 根结 点 ,而 在 中序序 列 中根 结
点恰 是左 、右 子树 的分 界 点, 因此 ,可 按 以下方 法构 造二 叉树 :
1 用后 序序 列 的最 后一个 结点作 为根 结 点 ; ) 2 在 中序 序列 中查 找根 结点 的位 置 , 并 以此 为界 将 中序序 列 划 分为 左 、右 两个 子序 列 ,它 们分 别 是 ) 左 、右 子树 的中序序 列 ; 3 根 据左 、右 子 树 的 中序 序 列 中 的结 点个 数 ,将 后序 序 列 去掉根 结 点 后 的序列 划 分为 左 、右两 个 子 )
# n l e<sd o-> i cud ti h ≠n l e t i h ≠ cud <sdi > i b.
tp df t c B T d { / y e e s ut iNo e / r 二叉 树 的二叉链 表存储 表示 c a a ; hr t da
} iNo e B Te ; BT d , ire
相关文档
最新文档