a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 205|回复: 3

[程序员] 2012年软件水平程序员考试复习笔试知识辅导(二)

[复制链接]
发表于 2012-8-2 08:51:15 | 显示全部楼层 |阅读模式
二叉树三种遍历的非递归算法(背诵版)   1.先序遍历非递归算法
) p  v2 K; }$ R7 W2 F9 i#define maxsize 100
! G7 k- X* I' ]0 u$ R& Ttypedef struct; j0 h4 B  I, J! T9 f0 s
{
) u2 G! z( v( pBitree Elem[maxsize];
3 G& N1 q# k' o; d; p+ {int top;
* |1 Q8 U3 M, n1 }  N( d/ h}SqStack;, z. ~! y! _2 \# Y
void PreOrderUnrec(Bitree t)% Q$ C2 w. b# d  r/ S9 P1 f
{+ @' y- x2 z: a" z# S, F. k
SqStack s;$ f$ Y: x) |& K  C: j0 Y' M: J$ S
StackInit(s);
% z/ j2 v# F( m, B3 Zp=t;
) S1 W* J/ Y5 L& p0 R! C( ~4 ?while (p!=null || !StackEmpty(s))
" m1 G$ x; l% t0 q{
% ]2 S/ l( b; f) \while (p!=null) //遍历左子树7 Z* O7 P6 \! b
{8 p6 g2 |4 E2 v5 h) T3 a
visite(p->data);
! V9 ~$ j5 L% o6 c+ _! Spush(s,p);3 c* U/ V6 P9 L. e& g6 O& z
p=p->lchild; ' P4 c" g1 G( D4 l$ w
}//endwhile! _# o4 s7 ~5 o7 H" Z+ Z% V
1 S* h" E# t# C# l: |: n
if (!StackEmpty(s)) //通过下一次循环中的内嵌while实现右子树遍历
9 E6 L7 T- w7 t# j5 r: B4 F{3 q/ g  V7 W7 L4 h+ `. d4 ~
p=pop(s);
. E6 v/ M% i  J$ Z/ X/ v) zp=p->rchild; 1 F6 Y% I, {# W& Z8 j, K
}//endif
0 B) i0 o9 w7 t: V}//endwhile 0 f9 a* C4 p1 O' q3 N4 `9 ]) c
}//PreOrderUnrec
回复

使用道具 举报

 楼主| 发表于 2012-8-2 08:51:16 | 显示全部楼层

2012年软件水平程序员考试复习笔试知识辅导(二)

 2.中序遍历非递归算法 #define maxsize 100  G, I6 ^4 B' V7 E' ~
typedef struct9 M2 c: L) ^6 C# a! d% F" U: X
{
2 `4 ?# {, n7 @! ~1 T1 |Bitree Elem[maxsize];5 u+ [5 `9 a# v
int top;7 M; Y: y* }& j9 U0 _
}SqStack;& Y. F! y% E4 P1 D$ D; {8 B
void InOrderUnrec(Bitree t)9 f% J: t( l1 O+ z
{4 t. A7 A0 A" o. e
SqStack s;
# G1 q. K; x# N3 y* ]StackInit(s);! m0 L9 @2 M7 T& _( y; c8 \6 [$ y
p=t;, D/ c7 ~* ^- g" J/ I5 O
while (p!=null || !StackEmpty(s))+ p9 j( O; |* f
{
0 {  O  _* [$ Nwhile (p!=null) //遍历左子树
7 f) J5 g8 {% J. B' L{
/ t! F+ _1 z5 Q. a# o# r+ Y6 Tpush(s,p);
8 u: x6 i* \- G, P, S2 Vp=p->lchild;
$ w3 A* G; {# E' W0 W. N$ Y5 `}//endwhile
/ |2 G& P& K0 Y! c4 i. a" g7 A( ^2 D! N3 d' j
if (!StackEmpty(s))# L7 _3 e& N8 l
{
; \- x" u0 E: _7 Q, T# M# xp=pop(s);
6 t; m: ^1 ^9 E4 J  z. svisite(p->data); //访问根结点$ G0 ^) I& U& p% V9 i* l5 _+ y
p=p->rchild; //通过下一次循环实现右子树遍历. c4 }) M; V; @: j! X  u2 L- G5 V
}//endif $ _/ y( N" c: L0 ?9 w
}//endwhile
' F. o8 d! x9 ?% S3 C}//InOrderUnrec
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-2 08:51:17 | 显示全部楼层

2012年软件水平程序员考试复习笔试知识辅导(二)

 3.后序遍历非递归算法 #define maxsize 100
  y- B9 g1 _8 {typedef enum{L,R} tagtype;
# m' {+ u! `) B7 `8 ]; g% Ftypedef struct ' @) f9 p2 N" d3 _, f/ M$ L- d
{! h8 q) Z0 x$ i; b7 ~# l
Bitree ptr;
5 S; W  d0 X0 |, u' ftagtype tag;
. R* m5 p2 x! S}stacknode;  `2 k+ j4 n6 J" H% V
typedef struct2 C8 l8 H8 v& I' K* `
{
( ?7 s! S) h5 d$ A; E; }2 G) _, q; s2 D9 |stacknode Elem[maxsize];
- V5 J( f: @; K( d4 l; Wint top;
0 z) u! X* ]/ U) w}SqStack;
/ }( d9 x/ ~! Q# K: G
/ J" w9 J: F4 A//后序遍历
7 Z0 K; j& {5 D4 R, u/ Uvoid PostOrderUnrec(Bitree t)
2 w3 ?) H( F) p{
2 W5 P4 T5 `) D" ESqStack s;& \; V, Q) |$ K, n- K
stacknode x;
! H8 o3 n6 u$ ?* H+ Y  YStackInit(s);
( J, u2 t" C6 Wp=t;
# p- n+ X' V* O8 r/ ]/ t
' m+ w' u& T) F" B& t  udo & W, L4 h; {$ b6 W
{. o) {4 n# H; @( u/ w8 L. x
while (p!=null) //遍历左子树$ R  n& u! k3 L7 Y4 H+ V& z
{
; \& D, Q+ I! x5 K6 i& wx.ptr = p;
5 [; V, |' X) ~' g" \% f% {( ?x.tag = L; //标记为左子树' ]/ N3 U' K+ p
push(s,x);
7 I* r8 F4 o" @. k) X, j% P8 wp=p->lchild;  K3 q0 X5 [* e  h
}
  W2 o2 s- x' h* u# t2 c1 H
# ]7 A3 E( A/ L( j3 h2 Wwhile (!StackEmpty(s) &&s.Elem[s.top].tag==R) 3 ]* f( u) u, i* W6 i* d
{7 n) y3 c% [1 Z# \! l* o$ ~
x = pop(s);1 w3 e& Y! d2 f
p = x.ptr;% L: W) a7 e0 y5 o( T" ?
visite(p->data); //tag为R,表示右子树访问完毕,故访问根结点
: i2 u' t7 R2 v6 _* g# k}" m. e* i/ e# C& v1 Y

) H% }% @8 y: w) I8 Rif (!StackEmpty(s))
4 p9 r) [8 i2 \3 O8 ~' S{8 Y6 j0 ?: I+ v* h+ X' k4 f
s.Elem[s.top].tag =R; //遍历右子树7 U7 G; F, e/ x4 v9 X% W+ K8 i6 I
p=s.Elem[s.top].ptr->rchild; & ^* d# f. Z$ H, ~9 R1 l
}
* j7 j4 r6 q7 @}while (!StackEmpty(s));) W; d# ]0 ~  `* R: x6 @
}//PostOrderUnrec
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-2 08:51:18 | 显示全部楼层

2012年软件水平程序员考试复习笔试知识辅导(二)

 4.层次遍历算法   // 二叉树的数据结构
) {' D) V% t3 B% o: r9 O& K; D4 b8 L/ |  ?6 r
structBinaryTree
+ Q% l+ R6 ~2 h7 w- {' p* X{% g# Z# \7 k$ I, P! ~3 p2 r
int value; // 不写模板了,暂时用整形代替节点的数据类型
( Y2 {  v) K7 `6 d: SBinaryTree *left;* b6 q7 I% U5 e  z  a, O
BinaryTree *right;  `; U! u" w) o) P3 |
};
3 S& g, `' u7 s' ^- \& HBinaryTree*root; // 已知二叉树的根节点
) M. O$ {; n4 D//层次遍历$ v  ]( ~6 x2 _
voidLevel( const BinaryTree *root )  o; T4 v0 m$ a5 ]; F' y( I
{
# y! [" P4 z) r$ x2 `: KQueue *buf = new Queue(); // 定义一个空队列,假设此队列的节点数据类型也是整形的
2 [# v: X4 ]" L  J" cBinaryTree t; // 一个临时变量  h4 r) Q& X% }1 A/ W: z
buf.push_back(root); //令根节点入队
: u/ g1 k- i  E; M0 W* r6 Kwhile( buf.empty == false ) // 当队列不为空
% K: o; K- K4 o% b: c{+ D) P* ~# s/ d4 x4 N% S
p = buf.front(); // 取出队列的第一个元素
. {! o. M4 A6 J' Acoutright != NULL ) // 若右子树不空,则令其入队
, E5 `2 J" ^" s. R5 n{
5 V+ n& I2 v: e% w- F' G. Wq.push( p->right );3 U' `; W$ z1 R
} * v/ H  d& M. V* G+ O
buf.pop(); // 遍历过的节点出队
! m$ D! [1 h4 n! h& f5 G6 f; H- G}
0 S/ H- @) I" q4 s# t- ecout
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-18 10:06 , Processed in 0.289741 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表