[プロ技] 二分木の操作関数

woody_1227 オーナー 公式アカウント


ログインすると、チェック機能を利用できるようになります。
Tree型の定義
typedef struct node { //空木は(Tree *)NULL
int data; //格納される整数値データ
struct node *left; //左部分木を指すポインタ
struct node *right; //右部分木を指すポインタ
} Tree;

typedef Tree Node; //使用場面に応じて、TreeとNodeを使い分ける
[自己参照構造体]

二分木の操作関数
[コンストラクター]
①空木を取得する                      …getEmptyTree()
②新しいノードを作る                    …createNode()
[アクセサー]
③ノードにデータを格納する                 …setNodeData()
④ノードからデータを取り出す                …getNodeData()
⑤左または右部分木に部分木を格納する            …setSubTree()
⑥左または右部分木のポインタを取り出す           …getSubTree()
⑦左または右部分木を保持するメンバ変数のアドレスを取り出す …getSubTreeRoot()
[データ構造に依存しない→コンストラクターやアクセサーを用いて実装]
⑧空木かどうか調べる                    …isEmptyTree()
⑨指定ノードのメモリ領域を解放する             …freeNode()
⑩二分木内のノードをすべて削除する             …rmTree()
⑪二分木内のデータを表示する                …printTree()

演習ではこれらを利用して二分木を操作する
・完全にバランスした二分木の作成
・指定したデータを持つノードの削除
・二分探索木の作成
・二分探索木内のノードの追加削除 ... etc.

ノードの削除について
・3つの場合を考える必要がある
 ・それぞれの場合で削除方法が異なる
  ・リーフ(葉)の場合
  ・子を 持つノードの場合
  ・子を 持つノードの場合

リーフの削除
・これは簡単

子を1つ持つノードの削除
・これも簡単

子を2つ持つノードの削除
・この場合は単純に削除できない
 最も削除が簡単なのはリーフ(葉)だよね … だったら削除対象にリーフの値をコピー
・削除対象にコピーするリーフは、どれにする?
 ・リーフならどれでもいい→最も探しやすいのはどれ?
              最左端、または最右端のリーフ
※通常は最左端のリーフを選ぶことが多い