データ構造の表現法 -木構造と配列-

データ構造

木構造:根、枝、節、葉をもつ

 根:ルートとも呼ばれる。これ以上さかのぼれない一番上位の節(一番親になる節)  枝:節と節をつなぐエッジの事。  節:ここにデータが格納されている。枝によって接続されてる。上位に向かってたどると、必ず根にたどり着くはず  葉:一番下位の節、それ以上の子要素を持たない。

  親           根
 /\        / | \ ← 枝
子  子      節  節  節 
          /\ /\ /\  
           葉  葉 葉 葉 葉

二分木  C++でどうやって表現する?

        根   
      /   \
     節     節
      / \     / \
    節  節  節   節
    /\  /\ /\   /\
    葉 葉葉 葉葉 葉 葉
構造体を使って、まじめに概念通り実装
struct tree
{
    int node;//格納するデータ
    struct tree *left; //左の子
    struct tree *right; //右の子
}
構造を考慮して、配列で表現
             根       
       /   \  
      節      節
      / \      / \   
     節   節   節   節
    /\   /\  /\   /\ 
   葉  葉 葉 葉 葉 葉 葉

           0              ← 1段目 1個のデータ
        /    \
       1       2          ← 2段目 2個のデータ
       / \      / \
      3    4    5     6   ← 3段目 4個のデータ
      /\   /\  /\   /\ 
     7   8 9 10 11 12 13   14 ← 4段目 8個のデータ
     

上の図からわかること: n段目には何個の節がある? 2の(n-1)乗個の節(データ)があるよ。

教科書P178(1)の2分木

[ 0][ 1][ 2][ 3][ 4][ 5][ 6][ 7][ 8][ 9][10][11][12][13][14]
[ 6][ 3][ 7][ 1][ 4][  ][  ][  ][  ][  ][  ][  ][  ][  ][  ]

(仮) 逆もやってみよう(配列表現→木構造図示)

[ 0][ 1][ 2][ 3][ 4][ 5][ 6][ 7][ 8][ 9][10][11][12][13][14]
[ 7][ 9][15][22][11][18][27][  ][  ][  ][  ][  ][  ][  ][  ]

練習問題:これは配列で表すとどうなる?

        7           
      /  \
     9     15
    / \   / \ 
   22  11  18   27