数学建模社区-数学中国
标题:
求树的节点个数求法,求助啊!!!
[打印本页]
作者:
qiandongdong
时间:
2014-8-20 23:31
标题:
求树的节点个数求法,求助啊!!!
求树的节点个数的求法啊或matlab代码,我是新手,真心编了好久没结果。请前辈们帮帮忙啊~
作者:
madio
时间:
2014-8-21 00:16
就是一个遍历树的所有节点的算法,我帮你找到一个
首先需要定义树的存储。如果是C实现,应该是链表实现,每个节点用四个属性标志:
2 ?3 n# b+ n; {# s
tree_nodename:节点名字或序号
; n y4 d1 q# ?! ?! _
tree_nodevalue:节点对应的值
I$ k" q% J' U; u* p
tree_nodefather:节点父亲,如果没有父亲,值为空
/ d7 s3 B0 h9 G
tree_nodeson:节点的第一个儿子(最左边),如果没有儿子,值为空
& w+ Y( A3 Q8 |4 }
tree_nodeneighbor:节点的右边兄弟,如果右边没有兄弟,值为空
+ I- o5 s; k3 P) X" s/ [
树的搜索,因为不限制搜索顺序,这里使用深度优先。不用递归,可以用栈实现。
$ s& w3 Y0 E4 o* D7 V1 Q
. j* r/ r, V. O) r9 P
刚学了点matlab,就使用matlab实现。Matlab中没有链表的概念,用数组实现。
( `" y/ c8 o5 f, y; T3 K7 m% R" D
' n# T( T# H; G+ v8 N0 g" z% t
%matlab源程序
6 \' e3 d+ w7 w
%输入:树的深度、树的广度、搜索的值
/ d3 Z* D7 j' [4 V% U! \: [ f" y
%返回:树中接近的值、节点名字,如果没有接近的值,节点名字为空
6 u5 J6 @0 }5 P* O6 F
function[valueintree, nodeintree] = tree(tree_depth, tree_width, seek_value)
8 q; X" F9 U/ o8 p. b8 @
%根据树的深度、节点的儿子数量计算树总的节点个数
+ @. v* G3 Y" T! i6 v
node_num = 0;
6 E# T. S; u9 ~' l
for n= 0 : (tree_depth-1)
7 M- [$ \- `0 a+ w' a
node_num = node_num + tree_width ^ n;
% L3 @1 D/ P# p& Z2 H% T
end
8 ^4 x3 B- V7 A o Y# j6 Z
4 a" m) w- G( r9 M! v# n
%为树的存储空间赋值
& J) f7 }/ v8 ^& m. ~
%node name,按照广度优先为节点排号
) O) \+ d. ?% a/ U9 E: Z( Q$ o
tree_nodename = (1 : node_num);
; T. W5 H1 H, Z' E
%node value
$ D; c* l" ~/ w: p1 x2 w* \
tree_nodevalue = rand(1 : node_num);
- r- l7 X2 ~! S! J
%node father and son
/ O" E; ?: Q8 c4 |; Y1 l
tree_nodefather(1) = 0;
0 `- \' t0 R$ n; _" G
tree_nodeson = zeros(1, node_num);
0 K$ R+ }/ R) v% Z3 `
n = 2;
s2 y1 J& M* \" S3 }8 v I2 J
k = 1;
1 c+ @ z5 r; w; C! \4 A% M& s
while n <= node_num
7 P2 \7 V0 S4 D4 Y; W
for m = 1 : tree_width
. f. I! h# I7 j( @3 p# ^. c
tree_nodefather(n) = k;
2 H4 d3 _- v6 E$ f8 J3 `: f* z% H
if m==1
& Q1 f' f+ F) M; E
tree_nodeson(k) = n;
0 W+ ~. i/ k; D; c4 g
end
% x7 I4 d# B: _7 m$ W9 i) P
n = n + 1;
6 C. \4 X+ r5 i/ c# G9 k
end
# b0 M4 d f0 r* w+ s
k = k + 1;
5 z' J( |# ^ D0 r. `- a
end
) m8 [, U q8 |3 C* s! k4 B6 W0 V
%node neighbor
g0 g* k: `/ E. |% I
tree_nodeneighbor(1) = 0;
8 N( S" s6 E1 ^9 D
n = 2;
$ Z s/ A; z9 {$ R5 L
while n <= node_num
& i3 M( B# I1 A m: t
for m = 1 : tree_width
" ?6 m, j; _; o
if m ==tree_width
+ ^) h. E% m s2 m% }8 [4 Y) B
tree_nodeneighbor(n) = 0;
8 b: Q4 i' u; s2 _+ A! @1 j
else
9 \6 h( h Q) b1 N3 x
tree_nodeneighbor(n) = n + 1;
) T3 Q7 T0 `5 _; y4 b
end
. J4 P- q% `. C' \7 e. O0 p
n = n + 1;
4 o6 ]7 a% z% P$ @
end
( \! c* y" x) [' d( o2 u$ [* h( o- V
end
+ ^ B* w4 ^( z0 H3 A
8 ~3 Y, w$ k- {3 ?+ ]! ?" z3 d
%下面是有效程序段,用栈实现
+ P4 U6 k4 X; r2 |9 ~
stack = zeros(1, tree_depth);
+ }' B3 ^$ I* r" W/ e
nodeinstack = zeros(1, node_num);
% f, a' S c' U$ \
stack_ptr = 1;
( ?, O \' k3 ~
stack(1) = 1;
; V8 ~$ Y9 @9 F
nodeinstack(1) = 1;
% D1 w U$ N# L! @1 O7 y% j8 l
valueintree = seek_value;
2 P! ~! z5 w6 L1 y4 `
nodeintree = 0;
& V% m) E0 v0 Y8 a# ^8 a
, c: S. \' R' ^- F9 n& L
while stack_ptr > 0
6 y: V! P, R6 o3 |* o8 u1 n: J
n = stack(stack_ptr);
; S" N3 z5 O8 _& a+ ~& F8 X" h
if abs(tree_nodevalue(n) – seek_value) < 1e-3
9 p8 d4 c6 v) R
%如果搜索到值,返回
, b" E: S# j. J. n* o! d5 N ~
valueintree = tree_nodevalue(n);
( N6 H0 X; i: U- l
nodeintree = tree_nodename(n);
2 w4 m" Y, r; X s. c0 |! j* ?3 H
break;
' E3 V- t3 @( r- Y2 S
end
9 M) G5 Q. A% K! @- B6 E5 ?, k
2 s; F6 }2 y+ f* ]' O
if tree_nodeson(n) ~= 0 & nodeinstack(n) == 1
- A( A# p" m' m: ~/ n- r# ^
%如果节点有儿子,并且第一次入栈,将儿子节点入栈
$ c5 A1 H, ^* E L0 r" i
stack_ptr = stack_ptr + 1;
$ A, F" u$ h8 Z6 f
m = tree_nodeson(n);
% |7 r; o9 v8 v+ ]9 [
stack(stack_ptr) = m;
; M2 |0 P+ Y+ Z* {2 R# H% `- W M" c
nodeinstack(m) = nodeinstack(m) + 1;
4 J u9 y. n9 G5 ]6 L- W/ G
elseif tree_nodeneighbor(n) ~= 0
; w( ` A( u& G/ w
%否则,如果节点右边有兄弟,节点出栈,然后将右边兄弟入栈
. Y/ L- z8 b7 [7 p
m = tree_nodeneighbor(n);
+ Q$ i+ y5 `0 P$ x+ K8 H
stack(stack_ptr) = m;
* c/ N3 a8 Z1 N9 r2 L, x$ |$ J
nodeinstack(m) = nodeinstack(m) + 1;
3 \* g4 \( S0 q2 N: l3 A; e" ?
else
5 v/ c0 O* b4 ~& X
%再否则,出栈,然后将父亲节点的入栈次数加一
, E3 @* k& [( s! ]
stack_ptr = stack_ptr - 1;
1 }: m! E C" n8 b
m = stack(stack_ptr);
. e& Z$ ? t( H }
nodeinstack(m) = nodeinstack(m) + 1;
* |1 U2 Y6 g& _
end
9 {- m; G: [8 N# o* s2 M/ H8 W
end
复制代码
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5