数学建模社区-数学中国
标题:
求树的节点个数求法,求助啊!!!
[打印本页]
作者:
qiandongdong
时间:
2014-8-20 23:31
标题:
求树的节点个数求法,求助啊!!!
求树的节点个数的求法啊或matlab代码,我是新手,真心编了好久没结果。请前辈们帮帮忙啊~
作者:
madio
时间:
2014-8-21 00:16
就是一个遍历树的所有节点的算法,我帮你找到一个
首先需要定义树的存储。如果是C实现,应该是链表实现,每个节点用四个属性标志:
. X1 P) d" _) T. U
tree_nodename:节点名字或序号
! N5 v# N. R2 y P, S
tree_nodevalue:节点对应的值
, b8 ^* u: S" h
tree_nodefather:节点父亲,如果没有父亲,值为空
8 S7 g2 d: l1 s/ V9 ~! h
tree_nodeson:节点的第一个儿子(最左边),如果没有儿子,值为空
6 V! m' B- F1 ?8 B2 S; H( x
tree_nodeneighbor:节点的右边兄弟,如果右边没有兄弟,值为空
, ?+ u4 [, y- W) F/ y n) A- f" u+ n
树的搜索,因为不限制搜索顺序,这里使用深度优先。不用递归,可以用栈实现。
2 o; [# P/ r0 p2 ^; E) W* I" M$ `
7 {0 n9 j+ P7 z3 D' @5 a
刚学了点matlab,就使用matlab实现。Matlab中没有链表的概念,用数组实现。
+ i/ b4 s- A4 i) Y& r* e
4 |; @+ `+ [7 X+ X5 D
%matlab源程序
4 h+ @4 B9 x$ Z+ F
%输入:树的深度、树的广度、搜索的值
& n) | v' S0 A
%返回:树中接近的值、节点名字,如果没有接近的值,节点名字为空
7 T; m5 x3 [6 }9 T5 C2 m8 s
function[valueintree, nodeintree] = tree(tree_depth, tree_width, seek_value)
5 x3 l6 l& V8 u4 _% ]
%根据树的深度、节点的儿子数量计算树总的节点个数
" S$ i4 e' M* }. e. e
node_num = 0;
; G0 Y7 Z" i5 g
for n= 0 : (tree_depth-1)
% g& h W! ~6 S/ j
node_num = node_num + tree_width ^ n;
; M9 J% H2 p) x: `0 K2 q; z: I" o
end
/ L+ [* ?4 u2 P; j2 \
9 C2 _! \5 q: q* c, s
%为树的存储空间赋值
7 h# l) H2 g6 y) y+ @! q' b7 g6 d
%node name,按照广度优先为节点排号
6 J6 [$ X( n; d% U3 d" ~6 Q7 A. {
tree_nodename = (1 : node_num);
2 C3 }! ]$ U, c6 A
%node value
' W- R. C5 w7 j
tree_nodevalue = rand(1 : node_num);
2 f" D% V4 M3 Q9 v A; |, _* i
%node father and son
. _% m# X9 Q# T: j' y
tree_nodefather(1) = 0;
& a( z( X$ F: P! c" g0 n7 i: v
tree_nodeson = zeros(1, node_num);
. ~- Q* V1 K) R- q" z' k
n = 2;
: {7 l! f3 v8 L( N+ E2 p d) H$ X
k = 1;
2 [8 E$ [( b8 ~# Z, A
while n <= node_num
6 p2 E! w; v' X* B
for m = 1 : tree_width
+ F# i. X& B' m2 R% \
tree_nodefather(n) = k;
3 T1 }/ q7 m3 R' n3 G; b& }
if m==1
5 t; u/ M! v/ V3 E
tree_nodeson(k) = n;
% s4 A" \+ H9 y7 x
end
5 j* J+ S4 K0 J! c/ V& k1 F# k* g2 e
n = n + 1;
( i0 `7 j% E! B5 s0 _) }! X; R" ~
end
* Y+ F% d5 b# r
k = k + 1;
* e1 o; s% n( Q5 h* ~/ [
end
+ _! a1 D4 {3 @4 f% i
%node neighbor
1 G2 Q( K1 Z) |0 }$ } J* G
tree_nodeneighbor(1) = 0;
( r* w6 ]# Y- ]; Z3 A7 s$ P0 z7 J
n = 2;
0 L1 O) J! E( w, Y Q' |0 e
while n <= node_num
: G$ M0 V3 _7 z- g' x1 \4 V
for m = 1 : tree_width
8 ~ U# y( O2 M4 o
if m ==tree_width
* j+ I+ B2 W8 ~2 b' i& D
tree_nodeneighbor(n) = 0;
* d* Z X1 ~1 w P& F _
else
6 i+ }' m7 k# m- D) \- O* x) q
tree_nodeneighbor(n) = n + 1;
; l1 y( y _0 a
end
! }# X2 }- p& ~/ F3 ^( n
n = n + 1;
5 a6 U1 o) b0 L2 n: V2 e
end
. i" i3 G( p) U) `, }4 B8 g7 C
end
. O& W. V3 S- i. J# q9 O; L0 T: F
I; C0 r% e% b1 X, Q* H" X
%下面是有效程序段,用栈实现
0 T" ~5 H1 }1 k( b
stack = zeros(1, tree_depth);
% n6 s6 [7 T4 I1 Q
nodeinstack = zeros(1, node_num);
0 W! ^: {- k& N. g# ]
stack_ptr = 1;
( K; U& {) c6 }+ ~6 ?3 m+ I
stack(1) = 1;
7 F; j) c7 B& D! H; _
nodeinstack(1) = 1;
0 c) [6 L7 X0 F7 ^
valueintree = seek_value;
' Y6 @9 _) H4 c& w3 m" t: u. r; K
nodeintree = 0;
" F ^* h: J; Q) |( I
& H+ G7 o1 W: K0 e
while stack_ptr > 0
6 Z8 c. |3 G( o7 j
n = stack(stack_ptr);
# R1 ^/ K! ~& s; E0 H" {
if abs(tree_nodevalue(n) – seek_value) < 1e-3
6 K7 q! U5 x' F& J7 x) l
%如果搜索到值,返回
8 }7 ?+ F& i9 Q
valueintree = tree_nodevalue(n);
/ {7 x b% w8 A
nodeintree = tree_nodename(n);
2 v7 h) p0 o$ I( }( T1 _! `! v
break;
$ {7 F/ W$ @# ?; C' P* q
end
6 m) b0 m. X% E3 o2 @/ p
; H+ }! P9 G: x6 p9 F, S9 w5 S
if tree_nodeson(n) ~= 0 & nodeinstack(n) == 1
' i4 z* ]1 {+ H! t0 p- G/ l9 ?0 x8 D
%如果节点有儿子,并且第一次入栈,将儿子节点入栈
6 A _ |! \+ m0 N9 v6 e9 W
stack_ptr = stack_ptr + 1;
; U9 z. _0 w7 _4 t" ?
m = tree_nodeson(n);
0 x$ N7 X7 h2 }$ h" h
stack(stack_ptr) = m;
9 M7 ^* D7 C: d2 q% T
nodeinstack(m) = nodeinstack(m) + 1;
& |4 w* m# U% ]# M% C( O- ?# P
elseif tree_nodeneighbor(n) ~= 0
( K3 r* E: ^& I/ y6 {0 |3 j
%否则,如果节点右边有兄弟,节点出栈,然后将右边兄弟入栈
" I6 n9 o, L- u! ?
m = tree_nodeneighbor(n);
! ?- h& v4 I& t7 j7 e
stack(stack_ptr) = m;
: R! ~2 c/ ^$ m4 ~
nodeinstack(m) = nodeinstack(m) + 1;
& R! [ k4 V( o2 r. D/ V
else
, M: \$ @& Q, s% i q; H# m
%再否则,出栈,然后将父亲节点的入栈次数加一
, o! a) f7 f- t+ c
stack_ptr = stack_ptr - 1;
, N: Z# @) G# f+ p1 _$ t
m = stack(stack_ptr);
) [0 s Z; N% H' z5 b% t' D" g
nodeinstack(m) = nodeinstack(m) + 1;
~0 p$ k% g7 m
end
2 m. s5 U( J5 o, g- I& b$ ]
end
复制代码
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5