数学建模社区-数学中国

标题: 求树的节点个数求法,求助啊!!! [打印本页]

作者: qiandongdong    时间: 2014-8-20 23:31
标题: 求树的节点个数求法,求助啊!!!
求树的节点个数的求法啊或matlab代码,我是新手,真心编了好久没结果。请前辈们帮帮忙啊~
作者: madio    时间: 2014-8-21 00:16
就是一个遍历树的所有节点的算法,我帮你找到一个
  1. 首先需要定义树的存储。如果是C实现,应该是链表实现,每个节点用四个属性标志:# z; O; b: D1 Z/ P0 n; V  w
  2.        tree_nodename:节点名字或序号  V3 R$ [* O5 `
  3.        tree_nodevalue:节点对应的值
    3 A* `9 f5 t- Z' ^  J) W0 V$ `
  4.        tree_nodefather:节点父亲,如果没有父亲,值为空1 L+ I) v) O% k5 p5 a6 G
  5.        tree_nodeson:节点的第一个儿子(最左边),如果没有儿子,值为空; N* \" ^. ~8 ^! A' W# @+ q3 E
  6.        tree_nodeneighbor:节点的右边兄弟,如果右边没有兄弟,值为空& J7 \# D% _+ a: X
  7.        树的搜索,因为不限制搜索顺序,这里使用深度优先。不用递归,可以用栈实现。: X6 ^9 ^7 ^8 S
  8. $ O8 ~8 n- z4 v! E4 i8 u# W
  9.        刚学了点matlab,就使用matlab实现。Matlab中没有链表的概念,用数组实现。4 |' h9 {8 z& H4 k
  10. / y0 r: O9 d& N5 `4 w& ^" Q+ q1 r/ E
  11.        %matlab源程序
    % N9 `8 r% O8 F) U# i9 [
  12.        %输入:树的深度、树的广度、搜索的值
    ; m9 C( }( _2 \5 E1 @) `! D
  13.        %返回:树中接近的值、节点名字,如果没有接近的值,节点名字为空
    5 }$ @0 D) B! e0 _. Z2 [3 L0 a
  14.        function[valueintree, nodeintree] = tree(tree_depth, tree_width, seek_value)
    7 Y* T- A1 j! M! k5 q5 V* w
  15.        %根据树的深度、节点的儿子数量计算树总的节点个数
    3 q, A/ P- k7 s0 {: a& z2 @
  16.        node_num = 0;
    * A* n/ v2 y7 U& O% Q9 o
  17.        for n= 0 : (tree_depth-1)0 K2 H! d3 _7 M8 Q/ g, H
  18.               node_num = node_num + tree_width ^ n;: E" k1 w/ a. p' L) w
  19.        end, j- ]% b1 T" g$ W) j

  20. & A: Z/ M  \# O% X3 r
  21.        %为树的存储空间赋值. Z0 Q& f* b7 g/ U+ p2 R3 f8 A
  22.        %node name,按照广度优先为节点排号4 ~3 {8 D1 K8 [0 s" ~; l0 @  e
  23.        tree_nodename = (1 : node_num);/ ]9 [* g! p/ C1 x2 n- P
  24.        %node value1 D/ _' m6 C( ]  w) k
  25.        tree_nodevalue = rand(1 : node_num);: q: E$ p* |4 @, `6 k
  26.        %node father and son* ^4 i% a2 h8 |- L) X9 h* e
  27.        tree_nodefather(1) = 0;  O" L: I4 A2 x/ j+ Y) s
  28.        tree_nodeson = zeros(1, node_num);, D+ V) S  u, \# s
  29.        n = 2;
      X: M% @7 x& C3 X4 V1 b$ g7 j+ Y9 |9 n
  30.        k = 1;
    6 W  B0 H  {9 z$ Z# y
  31.        while n <= node_num
    - E9 Z/ e! \7 `$ S
  32.               for m = 1 : tree_width
    8 h( C$ f3 P1 x
  33.                      tree_nodefather(n) = k;
    3 N. l# l" l  ]: W' K3 X
  34.                      if m==19 j, S3 b- y! k# \( |- l# d
  35.                             tree_nodeson(k) = n;/ L. X! V; S# g
  36.                      end: J3 Y/ l, ^9 o2 g1 G
  37.                      n = n + 1;& V1 m6 I) L& Y. l
  38.               end
    , ~  k! d0 F4 \8 G/ d- U" s
  39.               k = k + 1;
    " w6 [! w  B2 s
  40.        end
    9 S& d8 R- O+ C; y7 b
  41.        %node neighbor
    , M! ^( [0 a( L# q, j! p" [
  42.        tree_nodeneighbor(1) = 0;/ m/ |$ F4 \( e8 j3 T; M
  43.        n = 2;/ K% y6 O) t9 O9 `3 k8 {1 U) x$ a
  44.        while n <= node_num4 J+ y  T0 ?1 M0 s% h
  45.               for m = 1 : tree_width
    : H: G$ P' t' `' V4 r7 L- e; S
  46.                      if m ==tree_width
      b8 G/ |: S! R  w! `3 h4 _$ b
  47.                             tree_nodeneighbor(n) = 0;
    6 ^: I( P) H" P5 N; Y
  48.                      else0 P  N$ t& i% N9 P0 ]9 d! }
  49.                             tree_nodeneighbor(n) = n + 1;
    " H: I$ E7 {  d% n* W) T$ Z
  50.                      end
    ) L! J. Q  U2 i% ]6 {6 l. H8 ]
  51.                      n = n + 1;- q( t" J2 c+ O. L. M
  52.               end
    8 [: S! F7 }3 G* b
  53.        end; _3 ^5 I# `0 W7 L! B

  54. * i( F/ u9 ]6 f6 Y# }; E+ g% Q
  55.        %下面是有效程序段,用栈实现
    : V6 Z* n' {# ]  J- N
  56.        stack = zeros(1, tree_depth);
    2 `: M3 T4 l& G$ |4 H0 B
  57.        nodeinstack = zeros(1, node_num);# o1 u: Z4 X2 g$ w2 F
  58.        stack_ptr = 1;
    : b- Z4 N( l& {. Z
  59.        stack(1) = 1;! L! N( |* V5 L" k! \% a
  60.        nodeinstack(1) = 1;7 b' d4 g/ _( E: G
  61.        valueintree = seek_value;
    9 E" p* I8 D5 `( v. @0 x5 v
  62.        nodeintree = 0;4 W3 s" P0 j! s/ ]7 t# p
  63. 7 n" w4 D; \: P, k8 J% O" i: ]9 n
  64.        while stack_ptr > 0
    1 H  ^5 P6 }" ?4 `: }7 d
  65.               n = stack(stack_ptr);
    - t) T# F5 X2 o& i2 \4 G
  66.               if abs(tree_nodevalue(n) – seek_value) < 1e-3, e+ L9 t" ?/ b$ @( e
  67.               %如果搜索到值,返回+ ^- |/ J5 ~7 ]) N( x
  68.                      valueintree = tree_nodevalue(n);* f% W" J2 U4 L8 E2 K8 k3 a/ A
  69.                      nodeintree = tree_nodename(n);: I* R# Z4 Q1 T! b
  70.                      break;
    : s, [# r5 [9 R6 y
  71.               end
    / F" p' o; u. V# J
  72. & H) \9 C6 r, ]+ o, a
  73.               if tree_nodeson(n) ~= 0 & nodeinstack(n) == 1
    6 m# A4 v& w, P5 Y' u! V; G
  74.               %如果节点有儿子,并且第一次入栈,将儿子节点入栈
    $ ]  _8 _6 b0 k$ t9 L
  75.                      stack_ptr = stack_ptr + 1;" G, F+ B1 h  S4 e4 g2 o# ~
  76.                      m = tree_nodeson(n);2 y; N5 p6 z; k- [: _. Y& `* H1 O
  77.                      stack(stack_ptr) = m;
    ' s: L/ [) u& y( k
  78.                      nodeinstack(m) = nodeinstack(m) + 1;
    . F/ E3 v  \7 n# c* r# h
  79.               elseif tree_nodeneighbor(n) ~= 0
    4 j5 f2 _3 `' h) J
  80.               %否则,如果节点右边有兄弟,节点出栈,然后将右边兄弟入栈) Q& |) a. _) a4 k/ d& t9 n. f/ t7 g
  81.                      m = tree_nodeneighbor(n);
    ; b! P7 |2 }# n3 K! C4 e$ ]
  82.                      stack(stack_ptr) = m;, _- |$ v' V2 }' _, l
  83.                      nodeinstack(m) = nodeinstack(m) + 1;
    5 c9 m% D! V* V. H$ E$ k
  84.               else
    8 e! s6 O& L8 P+ D3 c: x: ~+ b- ~
  85.               %再否则,出栈,然后将父亲节点的入栈次数加一9 ~+ [& `5 f( _  ^9 H
  86.                      stack_ptr = stack_ptr - 1;" h: e4 P$ l+ B
  87.                      m = stack(stack_ptr);
    . |! z% v7 y7 o# @4 d- f9 n( g
  88.                      nodeinstack(m) = nodeinstack(m) + 1;$ B% b" B: g- p" H# ]
  89.               end; ~0 e, L# x: @5 k9 z
  90.        end
复制代码





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5