===== データ構造の表現法 -木構造と配列- =====
=== データ構造 ===
* 配列 → 配列、動的配列(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