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