数学建模社区-数学中国
标题:
求树的节点个数求法,求助啊!!!
[打印本页]
作者:
qiandongdong
时间:
2014-8-20 23:31
标题:
求树的节点个数求法,求助啊!!!
求树的节点个数的求法啊或matlab代码,我是新手,真心编了好久没结果。请前辈们帮帮忙啊~
作者:
madio
时间:
2014-8-21 00:16
就是一个遍历树的所有节点的算法,我帮你找到一个
首先需要定义树的存储。如果是C实现,应该是链表实现,每个节点用四个属性标志:
" Z6 P; k- x/ \ x. G$ T" f1 J
tree_nodename:节点名字或序号
) Z( u8 Z" y4 E8 _0 K/ Y
tree_nodevalue:节点对应的值
% b* O; }' M7 P. H
tree_nodefather:节点父亲,如果没有父亲,值为空
3 _! ^1 c h$ [9 d( s
tree_nodeson:节点的第一个儿子(最左边),如果没有儿子,值为空
8 @8 d3 K3 [1 S; q! W( R
tree_nodeneighbor:节点的右边兄弟,如果右边没有兄弟,值为空
% c8 `: }$ N$ T+ m6 N% {) p
树的搜索,因为不限制搜索顺序,这里使用深度优先。不用递归,可以用栈实现。
7 @0 M- K- R9 c/ r
4 K0 |' R! Q: {2 x
刚学了点matlab,就使用matlab实现。Matlab中没有链表的概念,用数组实现。
. W. G! i( w! g* E- T
+ J( y& u3 m) E d" r. s& L% P
%matlab源程序
- T5 x& ^6 G/ a) F2 V
%输入:树的深度、树的广度、搜索的值
% K6 X+ E$ J$ f% X) V
%返回:树中接近的值、节点名字,如果没有接近的值,节点名字为空
' A5 I. J ?$ M- c, Y
function[valueintree, nodeintree] = tree(tree_depth, tree_width, seek_value)
0 `4 l) O0 U7 c# I& A
%根据树的深度、节点的儿子数量计算树总的节点个数
! m8 a% [& S/ a" n9 [2 r
node_num = 0;
4 H: m6 d7 q0 W$ }' S8 M; C; E
for n= 0 : (tree_depth-1)
" n$ f0 D5 ?: a; a2 L
node_num = node_num + tree_width ^ n;
) H% C5 X; s1 O+ P, K' R3 R
end
3 R" {. @8 v( v) |' ~1 O6 M$ O" Q
% Z6 C9 N* v. p1 z I# w" b
%为树的存储空间赋值
# Y, S8 \# f; C; Z& ~3 ~" L
%node name,按照广度优先为节点排号
}# ^9 X3 F. J4 D. o1 T! Q1 f+ O
tree_nodename = (1 : node_num);
5 ^' f) t, v- V a3 G; v: E
%node value
3 K4 ^# P, P4 U# }
tree_nodevalue = rand(1 : node_num);
3 s- y8 x; v: s
%node father and son
' F7 l/ f. d. f8 x2 J, \3 K
tree_nodefather(1) = 0;
2 |" q( K) R M/ g) |# N
tree_nodeson = zeros(1, node_num);
; L0 `' a$ j# ~: }* j" X. K, q
n = 2;
5 X0 g8 R- w4 Y- V* g$ e
k = 1;
7 S6 _- m$ b. b. c
while n <= node_num
+ _* ~. o8 A* d6 B
for m = 1 : tree_width
6 Q. T8 y0 N% A( E9 f
tree_nodefather(n) = k;
/ `/ C: Y5 G: w5 S6 S6 d
if m==1
, i/ H6 @+ K: ?
tree_nodeson(k) = n;
: X* _( ], J7 b( T3 k
end
2 T/ \! P, A; a, C, P0 K3 C$ ]
n = n + 1;
/ z/ [4 _* ?) e& _
end
! T8 l9 r1 o- O
k = k + 1;
) w/ t- ]0 r; Z5 V1 f) ^
end
! N) m% z( S6 I
%node neighbor
7 G' [' W$ ]8 \( y% |4 ^
tree_nodeneighbor(1) = 0;
# ]2 _4 l' R- ^2 o* B2 _" q9 R: |
n = 2;
: [+ d* n. @" t" V, w9 y
while n <= node_num
* f; ~1 {: z$ B- P. c; M9 f% K
for m = 1 : tree_width
6 E7 x, W, k- G1 V f
if m ==tree_width
6 G7 }+ Q3 G4 O F3 T
tree_nodeneighbor(n) = 0;
& x# V% U/ w3 `+ i# M9 }3 G
else
q2 ~0 w% L% e" R' S
tree_nodeneighbor(n) = n + 1;
. v% b' a; ?. q# r" w
end
/ C5 c V6 A: M. k
n = n + 1;
( A4 n% S" W5 t. y6 x$ G- J$ M
end
3 P- P) S; d# O% M: e+ G5 s
end
$ i! {. {$ g4 T( r' W1 Q6 B
& } o) s; n2 @3 `- M" u
%下面是有效程序段,用栈实现
% L7 @6 J9 w- u
stack = zeros(1, tree_depth);
. r5 g! t' r: _( ^ ?. X
nodeinstack = zeros(1, node_num);
5 f4 P$ f) B/ F
stack_ptr = 1;
' h# b) w7 B. m3 `+ M) r1 l! m
stack(1) = 1;
+ |# |: M% m5 k* Y: R
nodeinstack(1) = 1;
) ^7 f" U4 L" t; U7 o$ f; z
valueintree = seek_value;
% \2 X- p# G; k( m7 {
nodeintree = 0;
# ?7 z" j! B8 c; [
- G" }8 p! }. o. T( m2 y0 g
while stack_ptr > 0
; }; b& ^; v8 x3 l1 v% i4 l
n = stack(stack_ptr);
) _: _0 l9 n9 J
if abs(tree_nodevalue(n) – seek_value) < 1e-3
, j" p! I. I! E" [$ v9 s4 Z
%如果搜索到值,返回
& O" B% q; W7 S: ?2 @) E
valueintree = tree_nodevalue(n);
2 l8 Y; C$ V4 f! q
nodeintree = tree_nodename(n);
* N# [) I6 C* @) F
break;
. b% ~3 b' @9 N+ s# {& n3 c9 {
end
7 v4 W( G% p& F& W- I
$ F7 w0 C" N. E K1 q( |
if tree_nodeson(n) ~= 0 & nodeinstack(n) == 1
( B9 \2 G" S0 D" j( |% D) w
%如果节点有儿子,并且第一次入栈,将儿子节点入栈
2 E( e0 h& l, I( B |
stack_ptr = stack_ptr + 1;
5 b1 k+ r* k' b' Q
m = tree_nodeson(n);
: M9 F* e7 K& \9 M/ k& N
stack(stack_ptr) = m;
+ F* v- O' d- i. @1 a: o
nodeinstack(m) = nodeinstack(m) + 1;
1 O4 G7 j* `+ j. G" B; l# [
elseif tree_nodeneighbor(n) ~= 0
7 u' |) y- U }, |
%否则,如果节点右边有兄弟,节点出栈,然后将右边兄弟入栈
/ \ Q, a }, U! l5 @/ N# B
m = tree_nodeneighbor(n);
5 z; h S" C: d- U" `' E( \
stack(stack_ptr) = m;
# i6 L" A! T. n! b" n7 B# F0 O
nodeinstack(m) = nodeinstack(m) + 1;
3 o8 w* @; C5 N( d
else
; E, {5 } ]+ t1 f
%再否则,出栈,然后将父亲节点的入栈次数加一
z' u" r& s% @5 _) V- o
stack_ptr = stack_ptr - 1;
& S! C5 Y, s8 n# w. l. _6 E
m = stack(stack_ptr);
1 d8 A2 c7 B6 A" s5 V( X; D* n
nodeinstack(m) = nodeinstack(m) + 1;
$ S) }% U6 W d
end
% s7 E x( h5 Y: o" J' _6 Z* d
end
复制代码
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5