データ構造の表現法 -木構造と配列-
データ構造
- 配列 → 配列、動的配列(new とか使ってとってdeleteでけすやつ)
- レコード型 → 構造体で表現できそう
- スタック → 配列+変数 LIFO(Last-in First-out 後入れ先出し) 下から詰めていって上からとる PEZとか、トランプを重ねて上からとる状態
- トランプをシャッフル(ごちゃまぜ)して、スタックにトランプの構造体を並べて上から配る
- キュー → 配列+変数 FIFO(First-in First-out 先入れ先出し) 待ち行列、並べた順にとる。先に並べたものを先にとる
- エンキュー: キューにデータを格納する → 行列の後ろにデータを追加する
- デキュー: データを待ち列から取り出す
- 木・グラフ
- グラフ:有向グラフと無向グラフがあるよ。 ノード(頂点)とエッジ(辺)で表される。
木構造:根、枝、節、葉をもつ
根:ルートとも呼ばれる。これ以上さかのぼれない一番上位の節(一番親になる節) 枝:節と節をつなぐエッジの事。 節:ここにデータが格納されている。枝によって接続されてる。上位に向かってたどると、必ず根にたどり着くはず 葉:一番下位の節、それ以上の子要素を持たない。
親 根
/\ / | \ ← 枝
子 子 節 節 節
/\ /\ /\
葉 葉 葉 葉 葉
二分木 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)乗個の節(データ)があるよ。
- ノード番号:上の図の配列の添え字に対応する番号の事(勝手に読んでるよ)
- 自分から見た右の子の番号 = 自分x2+2
- 自分から見た左の子の番号 = 自分x2+2ー1= 自分x2+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