数学建模社区-数学中国
标题:
求树的节点个数求法,求助啊!!!
[打印本页]
作者:
qiandongdong
时间:
2014-8-20 23:31
标题:
求树的节点个数求法,求助啊!!!
求树的节点个数的求法啊或matlab代码,我是新手,真心编了好久没结果。请前辈们帮帮忙啊~
作者:
madio
时间:
2014-8-21 00:16
就是一个遍历树的所有节点的算法,我帮你找到一个
首先需要定义树的存储。如果是C实现,应该是链表实现,每个节点用四个属性标志:
# z; O; b: D1 Z/ P0 n; V w
tree_nodename:节点名字或序号
V3 R$ [* O5 `
tree_nodevalue:节点对应的值
3 A* `9 f5 t- Z' ^ J) W0 V$ `
tree_nodefather:节点父亲,如果没有父亲,值为空
1 L+ I) v) O% k5 p5 a6 G
tree_nodeson:节点的第一个儿子(最左边),如果没有儿子,值为空
; N* \" ^. ~8 ^! A' W# @+ q3 E
tree_nodeneighbor:节点的右边兄弟,如果右边没有兄弟,值为空
& J7 \# D% _+ a: X
树的搜索,因为不限制搜索顺序,这里使用深度优先。不用递归,可以用栈实现。
: X6 ^9 ^7 ^8 S
$ O8 ~8 n- z4 v! E4 i8 u# W
刚学了点matlab,就使用matlab实现。Matlab中没有链表的概念,用数组实现。
4 |' h9 {8 z& H4 k
/ y0 r: O9 d& N5 `4 w& ^" Q+ q1 r/ E
%matlab源程序
% N9 `8 r% O8 F) U# i9 [
%输入:树的深度、树的广度、搜索的值
; m9 C( }( _2 \5 E1 @) `! D
%返回:树中接近的值、节点名字,如果没有接近的值,节点名字为空
5 }$ @0 D) B! e0 _. Z2 [3 L0 a
function[valueintree, nodeintree] = tree(tree_depth, tree_width, seek_value)
7 Y* T- A1 j! M! k5 q5 V* w
%根据树的深度、节点的儿子数量计算树总的节点个数
3 q, A/ P- k7 s0 {: a& z2 @
node_num = 0;
* A* n/ v2 y7 U& O% Q9 o
for n= 0 : (tree_depth-1)
0 K2 H! d3 _7 M8 Q/ g, H
node_num = node_num + tree_width ^ n;
: E" k1 w/ a. p' L) w
end
, j- ]% b1 T" g$ W) j
& A: Z/ M \# O% X3 r
%为树的存储空间赋值
. Z0 Q& f* b7 g/ U+ p2 R3 f8 A
%node name,按照广度优先为节点排号
4 ~3 {8 D1 K8 [0 s" ~; l0 @ e
tree_nodename = (1 : node_num);
/ ]9 [* g! p/ C1 x2 n- P
%node value
1 D/ _' m6 C( ] w) k
tree_nodevalue = rand(1 : node_num);
: q: E$ p* |4 @, `6 k
%node father and son
* ^4 i% a2 h8 |- L) X9 h* e
tree_nodefather(1) = 0;
O" L: I4 A2 x/ j+ Y) s
tree_nodeson = zeros(1, node_num);
, D+ V) S u, \# s
n = 2;
X: M% @7 x& C3 X4 V1 b$ g7 j+ Y9 |9 n
k = 1;
6 W B0 H {9 z$ Z# y
while n <= node_num
- E9 Z/ e! \7 `$ S
for m = 1 : tree_width
8 h( C$ f3 P1 x
tree_nodefather(n) = k;
3 N. l# l" l ]: W' K3 X
if m==1
9 j, S3 b- y! k# \( |- l# d
tree_nodeson(k) = n;
/ L. X! V; S# g
end
: J3 Y/ l, ^9 o2 g1 G
n = n + 1;
& V1 m6 I) L& Y. l
end
, ~ k! d0 F4 \8 G/ d- U" s
k = k + 1;
" w6 [! w B2 s
end
9 S& d8 R- O+ C; y7 b
%node neighbor
, M! ^( [0 a( L# q, j! p" [
tree_nodeneighbor(1) = 0;
/ m/ |$ F4 \( e8 j3 T; M
n = 2;
/ K% y6 O) t9 O9 `3 k8 {1 U) x$ a
while n <= node_num
4 J+ y T0 ?1 M0 s% h
for m = 1 : tree_width
: H: G$ P' t' `' V4 r7 L- e; S
if m ==tree_width
b8 G/ |: S! R w! `3 h4 _$ b
tree_nodeneighbor(n) = 0;
6 ^: I( P) H" P5 N; Y
else
0 P N$ t& i% N9 P0 ]9 d! }
tree_nodeneighbor(n) = n + 1;
" H: I$ E7 { d% n* W) T$ Z
end
) L! J. Q U2 i% ]6 {6 l. H8 ]
n = n + 1;
- q( t" J2 c+ O. L. M
end
8 [: S! F7 }3 G* b
end
; _3 ^5 I# `0 W7 L! B
* i( F/ u9 ]6 f6 Y# }; E+ g% Q
%下面是有效程序段,用栈实现
: V6 Z* n' {# ] J- N
stack = zeros(1, tree_depth);
2 `: M3 T4 l& G$ |4 H0 B
nodeinstack = zeros(1, node_num);
# o1 u: Z4 X2 g$ w2 F
stack_ptr = 1;
: b- Z4 N( l& {. Z
stack(1) = 1;
! L! N( |* V5 L" k! \% a
nodeinstack(1) = 1;
7 b' d4 g/ _( E: G
valueintree = seek_value;
9 E" p* I8 D5 `( v. @0 x5 v
nodeintree = 0;
4 W3 s" P0 j! s/ ]7 t# p
7 n" w4 D; \: P, k8 J% O" i: ]9 n
while stack_ptr > 0
1 H ^5 P6 }" ?4 `: }7 d
n = stack(stack_ptr);
- t) T# F5 X2 o& i2 \4 G
if abs(tree_nodevalue(n) – seek_value) < 1e-3
, e+ L9 t" ?/ b$ @( e
%如果搜索到值,返回
+ ^- |/ J5 ~7 ]) N( x
valueintree = tree_nodevalue(n);
* f% W" J2 U4 L8 E2 K8 k3 a/ A
nodeintree = tree_nodename(n);
: I* R# Z4 Q1 T! b
break;
: s, [# r5 [9 R6 y
end
/ F" p' o; u. V# J
& H) \9 C6 r, ]+ o, a
if tree_nodeson(n) ~= 0 & nodeinstack(n) == 1
6 m# A4 v& w, P5 Y' u! V; G
%如果节点有儿子,并且第一次入栈,将儿子节点入栈
$ ] _8 _6 b0 k$ t9 L
stack_ptr = stack_ptr + 1;
" G, F+ B1 h S4 e4 g2 o# ~
m = tree_nodeson(n);
2 y; N5 p6 z; k- [: _. Y& `* H1 O
stack(stack_ptr) = m;
' s: L/ [) u& y( k
nodeinstack(m) = nodeinstack(m) + 1;
. F/ E3 v \7 n# c* r# h
elseif tree_nodeneighbor(n) ~= 0
4 j5 f2 _3 `' h) J
%否则,如果节点右边有兄弟,节点出栈,然后将右边兄弟入栈
) Q& |) a. _) a4 k/ d& t9 n. f/ t7 g
m = tree_nodeneighbor(n);
; b! P7 |2 }# n3 K! C4 e$ ]
stack(stack_ptr) = m;
, _- |$ v' V2 }' _, l
nodeinstack(m) = nodeinstack(m) + 1;
5 c9 m% D! V* V. H$ E$ k
else
8 e! s6 O& L8 P+ D3 c: x: ~+ b- ~
%再否则,出栈,然后将父亲节点的入栈次数加一
9 ~+ [& `5 f( _ ^9 H
stack_ptr = stack_ptr - 1;
" h: e4 P$ l+ B
m = stack(stack_ptr);
. |! z% v7 y7 o# @4 d- f9 n( g
nodeinstack(m) = nodeinstack(m) + 1;
$ B% b" B: g- p" H# ]
end
; ~0 e, L# x: @5 k9 z
end
复制代码
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5