a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 206|回复: 3

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

[复制链接]
发表于 2012-8-2 08:51:15 | 显示全部楼层 |阅读模式
二叉树三种遍历的非递归算法(背诵版)   1.先序遍历非递归算法- V+ i: x9 t- o1 z# \3 }8 B
#define maxsize 100! [4 C2 C4 k0 x
typedef struct& t. w9 I% E; A; v! x( ^) c  Z
{' G. N5 F7 [# W/ {  ?
Bitree Elem[maxsize];
& c; @. A2 C. [: v! K4 vint top;
8 A: G( X% L1 V0 k- r5 E% z% ]}SqStack;3 c) V) b. v6 O% K
void PreOrderUnrec(Bitree t)
9 D* `4 x0 s6 E4 @# c{7 b8 z6 _  g1 s2 K+ ^% g) ~
SqStack s;
- T  N$ H; X! `8 ?7 K# oStackInit(s);
! b; V1 Q$ f: l7 w8 T. i' kp=t;: U* _, B# C' U
while (p!=null || !StackEmpty(s))" h5 H: ^2 p% p% W: u1 l+ a& y& w
{3 j9 p5 b1 t$ y4 b' _4 ~, T
while (p!=null) //遍历左子树# h( R6 b( v, h" |1 J$ d( k
{
) M7 r- r. a- Z% E* |& |  b. k0 Y4 Svisite(p->data);$ C7 `  E- `1 a: @. H
push(s,p);8 I* M  `3 a* c3 A
p=p->lchild;
: g% c  {3 m1 N: ]( U}//endwhile
; I4 a1 }2 |/ i$ U5 L& N& P% L" m+ I5 l: ^: C; d( \' W5 a
if (!StackEmpty(s)) //通过下一次循环中的内嵌while实现右子树遍历
6 P3 w9 N, [* F- a5 M{
' p( k2 x, Y5 q  M$ W) Kp=pop(s);6 F; E; m6 m, R& t1 J# p  |, e
p=p->rchild; ; |8 A5 \# K. j9 Z* N/ n
}//endif 1 x. U8 W$ H( S4 C
}//endwhile
0 g+ o& b/ U  g2 ]}//PreOrderUnrec
回复

使用道具 举报

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

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

 2.中序遍历非递归算法 #define maxsize 100
$ i" M! C- b# T) X* x) ~" P6 ztypedef struct
* Y+ W! j  A  j2 Z/ j! _* i, F{
. v; j3 S, K: `1 MBitree Elem[maxsize];& m* ^8 h7 r+ T2 f
int top;
* Z, p& n5 i: U! b" ]}SqStack;) ^7 N0 Y2 E5 X: v; ]( S7 c4 n
void InOrderUnrec(Bitree t)
0 h: w* n. b; o2 K3 }{, X. \' s8 Q/ H5 C) n* c/ A
SqStack s;$ k% z# M5 P+ e
StackInit(s);+ a% V% x  r* W& q9 q' K% i6 u+ t3 W' ^! b
p=t;
! j- b9 s. a& ^. K! w" s3 awhile (p!=null || !StackEmpty(s))
7 `8 }, T2 G4 ~- ^9 g{) ~. J. J0 b+ n* b  E1 H
while (p!=null) //遍历左子树, p! H, Q& O0 A# ~6 n: a. s. Y
{
9 [$ G: R3 I( V5 p" S7 Ppush(s,p);- b, O. {3 W& v. X3 S8 {9 g* n
p=p->lchild;
, S, K9 r0 ?* t" [& k) r}//endwhile" i6 M6 M! ^1 u9 d

7 r5 n' m7 L* Aif (!StackEmpty(s))2 C+ m! P! G  Y! H
{
2 h3 H9 a2 C3 y7 X8 c4 j6 M: o, E$ [p=pop(s);
6 S5 m& @; s4 [* R" z* t, y/ P$ Xvisite(p->data); //访问根结点  V) }; W2 q5 j# @/ X5 Z, P. Q8 L
p=p->rchild; //通过下一次循环实现右子树遍历
9 Y& K: s; U4 A% e  @}//endif
3 k0 R& u3 a/ I7 q+ V! O}//endwhile, M5 G! p) B& b& g
}//InOrderUnrec
回复 支持 反对

使用道具 举报

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

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

 3.后序遍历非递归算法 #define maxsize 100
  s1 J0 p; p! E/ btypedef enum{L,R} tagtype;
. p8 R; q8 r( n' S0 jtypedef struct : [" ^' s/ w% v  d" t4 C
{+ E- i" P& V9 k! g2 c/ ?
Bitree ptr;
- _( s* t  i  w6 F( @tagtype tag;) J. u2 d& H" f" E
}stacknode;
. V  ?" V$ L% F+ r) f( C7 Stypedef struct
2 @1 F# D6 I0 r/ |9 H. l6 T{
3 D7 S  q; V8 I  U9 Astacknode Elem[maxsize];; k- h, b* w/ ^! u- `2 o7 ~
int top;
% B6 ^5 Q& C* H0 J5 M! Y}SqStack;
, V8 p, Q- r' W3 J( o
( t, B) w4 c4 Z/ W//后序遍历
# Y& b! x2 r0 T$ }+ Rvoid PostOrderUnrec(Bitree t)4 d$ ?6 H+ W! A5 X0 j/ f- h* q, t: b- X
{: l. Q- c$ j) S$ @
SqStack s;
$ y" V% P5 o7 @stacknode x;5 F$ N& `) y% @9 N2 t0 ^
StackInit(s);; j% |; w9 O( U7 {& z
p=t;8 q' z  x1 \1 q5 B- _2 e- P/ F
- f/ E9 C9 [+ @  D# v9 {
do 1 j0 v$ f) q3 f. B- H
{5 M+ Y& S" U2 r) C/ ^
while (p!=null) //遍历左子树# o( Z- n. t3 ^( M( ~& F
{
  I% y( `$ w  X9 r! lx.ptr = p;
; B6 E! Q# n9 z6 \& Vx.tag = L; //标记为左子树6 Q6 ^4 u; D# W" i
push(s,x);
( j) D- h& W& z7 Qp=p->lchild;
- S/ N2 P; X5 {}9 ~; @9 e# |& r7 C, H6 h

7 J3 J8 K4 U9 u7 r3 M+ V- \) lwhile (!StackEmpty(s) &&s.Elem[s.top].tag==R) 6 V. w# B1 R& b0 b, ~" q! f
{- z9 [& S5 T' z) i
x = pop(s);
2 z' ?5 N/ P- w: U9 kp = x.ptr;; R7 d3 e2 P) i2 R
visite(p->data); //tag为R,表示右子树访问完毕,故访问根结点
# K4 M. h3 \0 c3 b}, y  g2 Y. ^' c. B7 ]
4 P1 m& d2 [% k4 M- P
if (!StackEmpty(s))
4 {# ]( n6 K( P) W  Y: g3 Q/ l{; ~+ k! E2 ?8 A$ y; v4 X
s.Elem[s.top].tag =R; //遍历右子树
8 V" i4 y$ S5 P4 ]/ W1 |& Wp=s.Elem[s.top].ptr->rchild;
+ ?4 n0 `4 ]! w+ N/ g. T5 B} # ~( W! Q; ?5 P0 l
}while (!StackEmpty(s));
1 R" ]& ]" c; a4 w3 ^! b) v8 I}//PostOrderUnrec
回复 支持 反对

使用道具 举报

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

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

 4.层次遍历算法   // 二叉树的数据结构- f. R5 c! X3 u# q- b( b
* [1 g: H+ B* |$ q9 A
structBinaryTree
/ N; G, ^& z8 q6 p9 ]2 E* y{/ C+ I0 l. \4 \
int value; // 不写模板了,暂时用整形代替节点的数据类型' R* s7 y: g/ K: j) _
BinaryTree *left;
  F/ [+ y9 V- B* F7 R  i' f1 GBinaryTree *right;
  N" z; y0 R1 W1 i5 f6 M};+ c2 d( w6 k9 @4 l4 B
BinaryTree*root; // 已知二叉树的根节点
2 p8 e* Y6 O8 y* |; B; C) R//层次遍历4 [1 d0 H  p' l+ C/ R$ F; {' s, d! z& S
voidLevel( const BinaryTree *root )
0 ^3 l) N, W+ H, U7 e  J5 \( w{
! X' Q. s0 F* u4 JQueue *buf = new Queue(); // 定义一个空队列,假设此队列的节点数据类型也是整形的
$ J2 e* Z# E) {3 C/ [BinaryTree t; // 一个临时变量+ ]- X+ S' j" q1 o* v8 f8 X
buf.push_back(root); //令根节点入队
: I- a1 d7 H, A* ]! I- C; Fwhile( buf.empty == false ) // 当队列不为空: \. s: d; O8 ^$ B9 W; B% B
{- U( e0 c; S8 T9 S9 Q7 }
p = buf.front(); // 取出队列的第一个元素
: A1 U% p) M3 }! l/ fcoutright != NULL ) // 若右子树不空,则令其入队
& x3 ?" r, T' b{5 W# r; x2 T8 N2 V
q.push( p->right );
( W! }! o/ {6 K: K+ O+ d3 l5 x2 I} & a) c- F4 C( q& f1 v
buf.pop(); // 遍历过的节点出队( d6 s, m4 y$ u# P3 x! ~- s3 H: r2 M
} - c% @& L6 f& D, K" U, L1 x
cout
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-8 19:03 , Processed in 0.274536 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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