(57)【要約】  効率的にツリーから、部分ツリーを削除し、また、あるツリーに他のツリーを挿入する。消去フラグ配列中、削除対象となる部分ツリーを構成するノードのノード識別子について、フラグをセットし、消去フラグ配列の値を参照して、部分ツリー削除後のツリーについて、それぞれのノードに、子ノードよりも同じ世代のノードを優先して付与された連続する整数であるノード識別子を付与し、付与された新たなノード識別子を、削除前のツリーのノードのノード識別子と関連付けて格納した新規ノード識別子配列を、記憶装置に生成し、かつ、親子関係定義配列および新規ノード識別子配列に基づいて、新たなノード識別子に関連付けて、当該ノード識別子をもつノードの親ノードのノード識別子を格納した、部分ツリー削除後のツリーの親子関係定義配列を、前記記憶装置に生成する。【特許請求の範囲】
【請求項１】
ツリー型データ構造を形成するすべてのノードに固有のノード識別子が付与され、前記ノード識別子が、ルート・ノードから始めて、親子関係のある親ノードと子ノードとの間では前記親ノードのノード識別子が前記子ノードのノード識別子より小さいという関係を満たす連続する整数であり、前記ルート・ノード以外の非ルート・ノードの各々のノード識別子に関連付けられた親ノードのノード識別子が格納された親子関係定義配列を記憶する記憶装置を備えた情報処理装置において、
第１のツリーから、前記第１のツリーの特定のノードと当該特定のノードの子孫ノードとからなる部分ツリーを削除する情報処理方法であって、
前記第１のツリーの親子関係定義配列を前記記憶装置から読み出すステップと、
初期値がセットされた消去フラグ配列を前記記憶装置に格納し、前記特定のノードのノード識別子および前記親子関係定義配列と前記消去フラグ配列とを参照して、前記部分ツリーの前記特定のノードおよびその子孫のノードに付与されたノード識別子に対応する前記消去フラグ配列中のフラグをセットするステップと、
前記第１のツリーから前記部分ツリーを削除したツリーである第２のツリーのすべてのノードに新たなノード識別子を付与し、前記新たなノード識別子が前記第１のツリーの前記ノード識別子に関連付けて格納された新規ノード識別子配列を前記記憶装置に生成するステップと、
前記親子関係定義配列および前記新規ノード識別子配列に基づいて、前記第２のツリーの非ルート・ノードの各々の前記新たなノード識別子に関連付けられた親ノードの各々の前記新たなノード識別子が格納された前記第２のツリーの新たな親子関係定義配列を前記記憶装置に生成するステップと、
を備えることを特徴とする情報処理方法。
【請求項２】
前記記憶装置に、前記ツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納したノード値格納配列が記憶され、
前記新規ノード識別子配列を参照して、もとのノード識別子と新たなノード識別子との関連付けにしたがって、前記ノード値格納配列を更新するステップを備えたことを特徴とする請求項１に記載の情報処理方法。
【請求項３】
前記記憶装置に、前記ツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納したノード値格納配列が記憶され、
前記新規ノード識別子配列を参照して、もとのノード識別子と新たなノード識別子との関連付けにしたがって、新たなノード識別子の各々と関連付けて、前記ノード値を格納した、新たなノード値格納配列を生成するステップを備えたことを特徴とする請求項１に記載の情報処理方法。
【請求項４】
前記新規ノード識別子配列を生成するステップが、
前記親子関係定義配列と同一のサイズの新規ノード識別子配列のための領域を、前記記憶装置中に確保するステップと、
新たなノード識別子を一時的に記憶するカレントノード識別子領域を、前記記憶装置中に確保して、その初期値を格納するステップと、
前記消去フラグ配列を参照して、前記消去フラグ配列のフラグがセットされていない場合には、当該新規ノード識別子配列の値として、前記カレントノード識別子領域の値を格納し、その後、前記カレントノード識別子領域の値を増分し、その一方、消去フラグ配列のフラグがセットされている場合には、当該新規ノード識別子配列の値として無効値を格納するステップと、を備えたことを特徴とする請求項１ないし３の何れか一項に記載の情報処理方法。
【請求項５】
前記部分ツリー削除後の親子関係定義配列を生成するステップが、
前記親子関係定義配列と同一サイズの格納アドレス配列のための領域を、前記記憶装置中に確保するステップと、
前記新規ノード識別子配列中、前記親子関係定義配列の値の格納位置と同じ位置の値を参照して、値が無効値である場合を除き、前記格納アドレス配列に、前記新規ノード識別子配列中の値を格納するステップと、
前記親子関係定義配列と同一サイズの親ノード識別子配列のための領域を、前記記憶装置中に確保するステップと、
前記新規ノード識別子配列中、前記親子関係定義配列の値が示す位置の値を参照して、前記親ノード識別子配列中、前記親子関係定義配列の値の位置と同じ位置に、前記新規ノード識別子配列の値を格納するステップと、
前記格納アドレス配列中の値に関連付けて、前記親ノード識別子配列の値を格納した親子関係定義配列を生成するステップと、を含むことを特徴とする請求項１ないし４の何れか一項に記載の情報処理方法。
【請求項６】
ツリー型データ構造を形成するすべてのノードに固有のノード識別子が付与され、前記ノード識別子が、ルート・ノードから始めて、子ノードよりも同じ世代のノードを優先して付与された連続する整数であり、前記ルート・ノード以外の非ルート・ノードの各々のノード識別子に関連付けられた親ノードのノード識別子が格納された親子関係定義配列を記憶する記憶装置を備えた情報処理装置において、
第１のツリーの所定のノードの子孫ノード群として第２のツリーを挿入することにより形成された第３のツリーのツリー型データ構造について、前記記憶装置中に新たな親子関係定義配列を生成する情報処理方法であって、
前記第１のツリーの第１の親子関係定義配列および前記第２のツリーの第２の親子関係定義配列を前記記憶装置から読み出すステップと、
前記第２のツリーのルート・ノードを前記第１のツリーの前記所定のノードの所定の順位の子ノードとして連結することにより形成される前記第３のツリーの世代毎に、前記第２のツリーに属するノードに隣接する前記第１のツリーに属するノードを特定し、前記第１のツリーに属する前記特定されたノードの情報を前記記憶装置に記憶するステップと、
前記記憶装置に記憶された前記第１のツリーに属する前記特定されたノードの情報を参照して、前記第３のツリーのすべてのノードに、ルート・ノードから始めて、子ノードよりも同じ世代のノードを優先して連続する整数である新たなノード識別子を付与し、前記第１のツリーに属するノードに付与された前記新たなノード識別子を前記第１のツリーのノードのノード識別子に関連付けて格納した第１の新規ノード識別子配列、および、前記第２のツリーに属するノードに付与された前記新たなノード識別子を前記第２のツリーのノード識別子に関連付けて格納した第２の新規ノード識別子配列を前記記憶装置に生成するステップと、
前記第１の親子関係定義配列および第２の親子関係定義配列と前記第１の新規ノード識別子配列および前記第２の新規ノード識別子配列に基づいて、前記第３のツリーの非ルート・ノードの前記新たなノード識別子に関連付けて前記第３のツリーの前記非ルート・ノードのノード識別子を格納することにより、前記新たな親子関係定義配列を前記記憶装置に生成するステップと、
を備えたことを特徴とする情報処理方法。
【請求項７】
前記記憶装置に、前記第１のツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納した第１のノード値格納配列が記憶され、前記第２のツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納した第２のノード値格納配列が記憶され、
前記第１および第２の新規ノード識別子配列を参照して、前記第１のツリーおよび前記第２のツリーのそれぞれのノード識別子と、前記第３のツリーの新たなノード識別子との関連付けにしたがって、前記第１のノード値格納配列および第２のノード配列の少なくとも一方を更新するステップを備えたことを特徴とする請求項６に記載の情報処理方法。
【請求項８】
前記記憶装置に、前記第１のツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納した第１のノード値格納配列が記憶され、前記第２のツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納した第２のノード値格納配列が記憶され、
前記第１および第２の新規ノード識別子配列を参照して、前記第１のツリーおよび前記第２のツリーのそれぞれのノード識別子と、前記第３のツリーの新たなノード識別子との関連付けにしたがって、前記新たなノード識別子の各々と関連付けて前記ノード値を格納した新たなノード値格納配列を生成するステップをさらに備えたことを特徴とする請求項６に記載の情報処理方法。
【請求項９】
前記第１のツリーに属する前記特定されたノードの情報を前記記憶装置に記憶するステップが、
前記第２のツリーの前記ルート・ノードが挿入される位置の情報に基づいて、前記第１の親子関係定義配列と同一のサイズの挿入マーク配列中、前記挿入される位置の直後のノードおよび前記直後のノードを先祖とするノードについて、当該挿入位置であることを示す値を格納するステップを含むことを特徴とする請求項６ないし８の何れか一項に記載の情報処理方法。
【請求項１０】
さらに、前記第１のツリーの各ノードの、当該第１のツリーのルート・ノードからの深さのレベルを表すレベル値を格納した第１のレベル配列を、前記記憶装置に生成するステップと、
前記第１のレベル配列中、前記第２のツリーのルート・ノードの挿入位置に相当するレベル値を参照して、前記第２のツリーの各ノードの、前記第１のツリーのルート・ノードからの深さのレベルを表すレベル値を格納した第２のレベル配列を、前記記憶装置に生成するステップと、を備え、
前記第１の新規ノード識別子配列および前記第２の新規ノード識別子配列を生成するステップが、
前記第１の親子関係定義配列および前記第２の親子関係定義配列と、それぞれ、同一のサイズである前記第１の新規ノード識別子配列および前記第２の新規ノード識別子配列のための領域を、前記記憶装置中に確保するステップと、
新たなノード識別子を一時的に記憶するカレントノード識別子領域を、前記記憶装置中に確保して、その初期値を格納するステップと、を含み、
前記挿入マーク配列中、その値が、挿入位置であることを示す値に変化している位置以外の位置においては、
（ａ）前記第１の新規ノード識別子配列中、当該位置の値として、前記カレントノード識別子領域の値を格納し、
（ｂ）その後、前記カレントノード識別子領域の値を増分する
ステップを、さらに含み、
前記挿入マーク配列中、当該挿入マーク配列の値が、挿入位置であることを示す値に変化する位置においては、
（ａ）前記第１のレベル配列中、当該位置のレベル値を参照し、かつ、前記第２のレベル配列中、同一のレベル値を有する範囲を特定し、
（ｂ）前記第２の新規ノード識別子配列中、当該範囲の先頭位置から順次、カレントノード識別子領域の値を格納し、
（ｃ）その後、前記カレントノード識別子領域の値を増分し、
（ｄ）前記第２の新規ノード識別子配列中、前記同一のレベル値を有する範囲への値の格納が終了すると、第１の新規ノード識別子配列の値として、前記カレントノード識別子領域の値を格納し、
（ｅ）その後、前記カレントノード識別子領域の値を増分する
ステップを、さらに含むことを特徴とする請求項９に記載の情報処理方法。
【請求項１１】
前記新たな親子関係定義配列を生成するステップが、
前記新たな親子関係定義配列と少なくとも同一サイズである第１の親ノード識別子配列のための領域および第２の親ノード識別子配列のための領域を前記記憶装置中に確保するステップと、
前記第１の親子関係定義配列によって関連付けられている子ノードのノード識別子および親ノードのノード識別子を、前記第１の新規ノード識別子配列を用いて、前記子ノードの新たなノード識別子及び前記親ノードの新たなノード識別子に変換するステップと、
前記第１の親ノード識別子配列中の前記子ノードの新たなノード識別子の値に対応する位置に前記親ノードの新たなノード識別子を格納するステップと、
前記第２の親子関係定義配列によって関連付けられている子ノードのノード識別子および親ノードのノード識別子を、前記第２の新規ノード識別子配列を用いて、前記子ノードの新たなノード識別子及び前記親ノードの新たなノード識別子に変換するステップと、
前記第２の親ノード識別子配列中の前記子ノードの新たなノード識別子の値に対応する位置に前記親ノードの新たなノード識別子を格納するステップと、
前記第１の親ノード識別子配列および前記第２の親ノード識別子配列を重ね合わせることにより前記新たな親子関係定義配列を生成するステップと、を含むことを特徴とする請求項６ないし１０の何れか一項に記載の情報処理方法。
【請求項１２】
ツリー型データ構造を形成するすべてのノードに固有のノード識別子が付与され、前記ノード識別子が、ルート・ノードから始めて、親子関係のある親ノードと子ノードとの間では前記親ノードのノード識別子が前記子ノードのノード識別子より小さいという関係を満たす連続する整数であり、前記ルート・ノード以外の非ルート・ノードの各々のノード識別子に関連付けられた親ノードのノード識別子が格納された親子関係定義配列を記憶する記憶装置を備え、
第１のツリーから、前記第１のツリーの特定のノードと当該特定のノードの子孫ノードとからなる部分ツリーを削除するように構成された情報処理装置であって、
前記第１のツリーの親子関係定義配列を前記記憶装置から読み出すデータ読み出し手段と、
初期値がセットされた消去フラグ配列を前記記憶装置に格納し、前記特定のノードのノード識別子および前記親子関係定義配列と前記消去フラグ配列とを参照して、前記部分ツリーの前記特定のノードおよびその子孫のノードに付与されたノード識別子に対応する前記消去フラグ配列中のフラグをセットする消去フラグ配列生成手段と、
前記第１のツリーから前記部分ツリーを削除したツリーである第２のツリーのすべてのノードに新たなノード識別子を付与し、前記新たなノード識別子が前記第１のツリーの前記ノード識別子に関連付けて格納された新規ノード識別子配列を前記記憶装置に生成する新規ノード識別子配列生成手段と、
前記親子関係定義配列および前記新規ノード識別子配列に基づいて、前記第２のツリーの非ルート・ノードの各々の前記新たなノード識別子に関連付けられた親ノードの各々の前記新たなノード識別子が格納された前記第２のツリーの新たな親子関係定義配列を前記記憶装置に生成する親子関係配列生成手段と、
を備えたことを特徴とする情報処理装置。
【請求項１３】
前記記憶装置に、前記ツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納したノード値格納配列が記憶され、
前記新規ノード識別子配列を参照して、もとのノード識別子と新たなノード識別子との関連付けにしたがって、前記ノード値格納配列を更新するノード値格納配列更新手段を備えたことを特徴とする請求項１２に記載の情報処理装置。
【請求項１４】
前記記憶装置に、前記ツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納したノード値格納配列が記憶され、
前記新規ノード識別子配列を参照して、もとのノード識別子と新たなノード識別子との関連付けにしたがって、新たなノード識別子の各々と関連付けて、前記ノード値を格納した、新たなノード値格納配列を生成するノード値格納配列生成手段を備えたことを特徴とする請求項１２に記載の情報処理装置。
【請求項１５】
前記新規ノード識別子配列生成手段が、
前記親子関係定義配列と同一のサイズの新規ノード識別子配列のための領域を、前記記憶装置中に確保し、
新たなノード識別子を一時的に記憶するカレントノード識別子領域を、前記記憶装置中に確保して、その初期値を格納し、
前記消去フラグ配列を参照して、前記消去フラグ配列のフラグがセットされていない場合には、当該新規ノード識別子配列の値として、前記カレントノード識別子領域の値を格納し、その後、前記カレントノード識別子領域の値を増分し、その一方、消去フラグ配列のフラグがセットされている場合には、当該新規ノード識別子配列の値として無効値を格納するように構成されたことを特徴とする請求項１４ないし１８の何れか一項に記載の情報処理装置。
【請求項１６】
前記削除後親子関係定義配列生成手段が、
前記親子関係定義配列と同一サイズの格納アドレス配列のための領域を、前記記憶装置中に確保し、
前記新規ノード識別子配列中、前記親子関係定義配列の値の格納位置と同じ位置の値を参照して、値が無効値である場合を除き、前記格納アドレス配列に、前記新規ノード識別子配列中の値を格納し、
前記親子関係定義配列と同一サイズの親ノード識別子配列のための領域を、前記記憶装置中に確保し、
前記新規ノード識別子配列中、前記親子関係定義配列の値が示す位置の値を参照して、前記親ノード識別子配列中、前記親子関係定義配列の値の位置と同じ位置に、前記新規ノード識別子配列の値を格納し、
前記格納アドレス配列中の値に関連付けて、前記親ノード識別子配列の値を格納した親子関係定義配列を生成するように構成されたことを特徴とする請求項１２ないし１５の何れか一項に記載の情報処理装置。
【請求項１７】
ツリー型データ構造を形成するすべてのノードに固有のノード識別子が付与され、前記ノード識別子が、ルート・ノードから始めて、子ノードよりも同じ世代のノードを優先して付与された連続する整数であり、前記ルート・ノード以外の非ルート・ノードの各々のノード識別子に関連付けられた親ノードのノード識別子が格納された親子関係定義配列を記憶する記憶装置を備え、
第１のツリーの所定のノードの子孫ノード群として第２のツリーを挿入することにより形成された第３のツリーのツリー型データ構造について、前記記憶装置中に新たな親子関係定義配列を生成するように構成された情報処理装置であって、
前記第１のツリーの第１の親子関係定義配列および前記第２のツリーの第２の親子関係定義配列を前記記憶装置から読み出すデータ読み出し手段と、
前記第２のツリーのルート・ノードを前記第１のツリーの前記所定のノードの所定の順位の子ノードとして連結することにより形成される前記第３のツリーの世代毎に、前記第２のツリーに属するノードに隣接する前記第１のツリーに属するノードを特定し、前記第１のツリーに属する前記特定されたノードの情報を前記記憶装置に記憶する挿入位置情報生成手段と、
前記記憶装置に記憶された前記第１のツリーに属する前記特定されたノードの情報を参照して、前記第３のツリーのすべてのノードに、ルート・ノードから始めて、子ノードよりも同じ世代のノードを優先して連続する整数である新たなノード識別子を付与し、前記第１のツリーに属するノードに付与された前記新たなノード識別子を前記第１のツリーのノードのノード識別子に関連付けて格納した第１の新規ノード識別子配列、および、前記第２のツリーに属するノードに付与された前記新たなノード識別子を前記第２のツリーのノード識別子に関連付けて格納した第２の新規ノード識別子配列を前記記憶装置に生成する新規ノード識別子配列生成手段と、
前記第１の親子関係定義配列および第２の親子関係定義配列と前記第１の新規ノード識別子配列および前記第２の新規ノード識別子配列に基づいて、前記第３のツリーの非ルート・ノードの前記新たなノード識別子に関連付けて前記第３のツリーの前記非ルート・ノードのノード識別子を格納することにより、前記新たな親子関係定義配列を前記記憶装置に生成する親子関係定義配列生成手段と、
を備えたことを特徴とする情報処理装置。
【請求項１８】
前記記憶装置に、前記第１のツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納した第１のノード値格納配列が記憶され、前記第２のツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納した第２のノード値格納配列が記憶され、
前記第１および第２の新規ノード識別子配列を参照して、前記第１のツリーおよび前記第２のツリーのそれぞれのノード識別子と、前記第３のツリーの新たなノード識別子との関連付けにしたがって、前記第１のノード値格納配列および第２のノード配列の少なくとも一方を更新するノード値格納配列更新手段を備えたことを特徴とする請求項１７に記載の情報処理装置。
【請求項１９】
前記記憶装置に、前記第１のツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納した第１のノード値格納配列が記憶され、前記第２のツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納した第２のノード値格納配列が記憶され、
前記第１および第２の新規ノード識別子配列を参照して、前記第１のツリーおよび前記第２のツリーのそれぞれのノード識別子と、前記第３のツリーの新たなノード識別子との関連付けにしたがって、前記新たなノード識別子の各々と関連付けて前記ノード値を格納した新たなノード値格納配列を生成するノード値格納配列生成手段をさらに備えたことを特徴とする請求項１７に記載の情報処理装置。
【請求項２０】
前記挿入位置情報生成手段が、
前記第２のツリーのルート・ノードが挿入される位置の情報に基づいて、前記第１の親子関係定義配列と同一のサイズの挿入マーク配列中、前記挿入される位置の直後のノードおよび前記直後のノードを先祖とするノードについて、当該挿入位置であることを示す値を格納するように構成されたことを特徴とする請求項１７ないし１９の何れか一項に記載の情報処理装置。
【請求項２１】
さらに、前記第１のツリーの各ノードの、当該第１のツリーのルート・ノードからの深さのレベルを表すレベル値を格納した第１のレベル配列を、前記記憶装置に生成する第１のレベル配列生成手段と、
前記第１のレベル配列中、前記第２のツリーの頂点ノードの挿入位置に相当するレベル値を参照して、前記第２のツリーの各ノードの、前記第１のツリーのルート・ノードからの深さのレベルを表すレベル値を格納した第２のレベル配列を、前記記憶装置に生成する第２のレベル配列生成手段と、を備え、
前記新規ノード識別子配列生成手段が、
前記第１の親子関係配列および前記第２の親子関係定義配列と、それぞれ、同一のサイズである前記第１の新規ノード識別子配列および前記第２の新規ノード識別子配列のための領域を、前記記憶装置中に確保し、
新たなノード識別子を一時的に記憶するカレントノード識別子領域を、前記記憶装置中に確保して、その初期値を格納するように構成され、
前記挿入マーク配列中、その値が、挿入位置であることを示す値に変化している位置以外の位置においては、
（ａ）前記第１の新規ノード識別子配列中、当該位置の値として、前記カレントノード識別子領域の値を格納するとともに、
（ｂ）その後、前記カレントノード識別子領域の値を増分するように構成され、
前記挿入マーク配列中、当該挿入マーク配列の値が、挿入位置であることを示す値に変化する位置においては、
（ａ）前記第１のレベル配列中、当該位置のレベル値を参照し、かつ、前記第２のレベル配列中、同一のレベル値を有する範囲を特定し、
（ｂ）前記第２の新規ノード識別子配列中、当該範囲の先頭位置から順次、カレントノード識別子領域の値を格納し、
（ｃ）その後、前記カレントノード識別子領域の値を増分し、
（ｄ）前記第２の新規ノード識別子配列中、前記同一のレベル値を有する範囲への値の格納が終了すると、第１の新規ノード識別子配列の値として、前記カレントノード識別子領域の値を格納し、
（ｅ）その後、前記カレントノード識別子領域の値を増分するように構成されたことを特徴とする請求項２０に記載の情報処理装置。
【請求項２２】
前記挿入後親子関係定義配列生成手段が、
前記新たな親子関係定義配列と少なくとも同一サイズである第１の親ノード識別子配列のための領域および第２の親ノード識別子配列のための領域を前記記憶装置中に確保し、
前記第１の親子関係定義配列によって関連付けられている子ノードのノード識別子および親ノードのノード識別子を、前記第１の新規ノード識別子配列を用いて、前記子ノードの新たなノード識別子及び前記親ノードの新たなノード識別子に変換し、
前記第１の親ノード識別子配列中の前記子ノードの新たなノード識別子の値に対応する位置に前記親ノードの新たなノード識別子を格納し、
前記第２の親子関係定義配列によって関連付けられている子ノードのノード識別子および親ノードのノード識別子を、前記第２の新規ノード識別子配列を用いて、前記子ノードの新たなノード識別子及び前記親ノードの新たなノード識別子に変換し、
前記第２の親ノード識別子配列中の前記子ノードの新たなノード識別子の値に対応する位置に前記親ノードの新たなノード識別子を格納し、
前記第１の新規ノード識別子配列の値および前記第２の新規ノード識別子配列の値のそれぞれに関連付けられた、前記第１の親ノード識別子配列の値および前記第２の親ノード識別子配列の値を重ね合わせることにより前記新たな、挿入後の親子関係定義配列を生成に格納するように構成されたことを特徴とする請求項１７ないし２１の何れか一項に記載の情報処理装置。
【請求項２３】
ツリー型データ構造を形成するすべてのノードに固有のノード識別子が付与され、前記ノード識別子が、ルート・ノードから始めて、親子関係のある親ノードと子ノードとの間では前記親ノードのノード識別子が前記子ノードのノード識別子より小さいという関係を満たす連続する整数であり、前記ルート・ノード以外の非ルート・ノードの各々のノード識別子に関連付けられた親ノードのノード識別子が格納された親子関係定義配列を記憶する記憶装置を備えたコンピュータにおいて、
第１のツリーから、前記第１のツリーの特定のノードと当該特定のノードの子孫ノードとからなる部分ツリーを削除するために、前記コンピュータにより読み出し可能な情報処理プログラムであって、前記コンピュータに、
前記第１のツリーの親子関係定義配列を前記記憶装置から読み出すステップと、
初期値がセットされた消去フラグ配列を前記記憶装置に格納し、前記特定のノードのノード識別子および前記親子関係定義配列と前記消去フラグ配列とを参照して、前記部分ツリーの前記特定のノードおよびその子孫のノードに付与されたノード識別子に対応する前記消去フラグ配列中のフラグをセットするステップと、
前記第１のツリーから前記部分ツリーを削除したツリーである第２のツリーのすべてのノードに新たなノード識別子を付与し、前記新たなノード識別子が前記第１のツリーの前記ノード識別子に関連付けて格納された新規ノード識別子配列を前記記憶装置に生成するステップと、
前記親子関係定義配列および前記新規ノード識別子配列に基づいて、前記第２のツリーの非ルート・ノードの各々の前記新たなノード識別子に関連付けられた親ノードの各々の前記新たなノード識別子が格納された前記第２のツリーの新たな親子関係定義配列を前記記憶装置に生成するステップと、
を実行させることを特徴とする情報処理プログラム。
【請求項２４】
前記記憶装置に、前記ツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納したノード値格納配列が記憶され、前記コンピュータに、
前記新規ノード識別子配列を参照して、もとのノード識別子と新たなノード識別子との関連付けにしたがって、前記ノード値格納配列を更新するステップを実行させることを特徴とする請求項２３に記載の情報処理プログラム。
【請求項２５】
前記記憶装置に、前記ツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納したノード値格納配列が記憶され、前記コンピュータに、
前記新規ノード識別子配列を参照して、もとのノード識別子と新たなノード識別子との関連付けにしたがって、新たなノード識別子の各々と関連付けて、前記ノード値を格納した、新たなノード値格納配列を生成するステップを実行させることを特徴とする請求項２３に記載の情報処理プログラム。
【請求項２６】
前記新規ノード識別子配列を生成するステップにおいて、前記コンピュータに、
前記親子関係定義配列と同一のサイズの新規ノード識別子配列のための領域を、前記記憶装置中に確保するステップと、
新たなノード識別子を一時的に記憶するカレントノード識別子領域を、前記記憶装置中に確保して、その初期値を格納するステップと、
前記消去フラグ配列を参照して、前記消去フラグ配列のフラグがセットされていない場合には、当該新規ノード識別子配列の値として、前記カレントノード識別子領域の値を格納し、その後、前記カレントノード識別子領域の値を増分し、その一方、消去フラグ配列のフラグがセットされている場合には、当該新規ノード識別子配列の値として無効値を格納するステップと、を実行させることを特徴とする請求項２３ないし２５の何れか一項に記載の情報処理プログラム。
【請求項２７】
前記部分ツリー削除後の親子関係定義配列を生成するステップにおいて、前記コンピュータに、
前記親子関係定義配列と同一サイズの格納アドレス配列のための領域を、前記記憶装置中に確保するステップと、
前記新規ノード識別子配列中、前記親子関係定義配列の値の格納位置と同じ位置の値を参照して、値が無効値である場合を除き、前記格納アドレス配列に、前記新規ノード識別子配列中の値を格納するステップと、
前記親子関係定義配列と同一サイズの親ノード識別子配列のための領域を、前記記憶装置中に確保するステップと、
前記新規ノード識別子配列中、前記親子関係定義配列の値が示す位置の値を参照して、前記親ノード識別子配列中、前記親子関係定義配列の値の位置と同じ位置に、前記新規ノード識別子配列の値を格納するステップと、
前記格納アドレス配列中の値に関連付けて、前記親ノード識別子配列の値を格納した親子関係定義配列を生成するステップと、を実行させることを特徴とする請求項２３ないし２６の何れか一項に記載の情報処理プログラム。
【請求項２８】
ツリー型データ構造を形成するすべてのノードに固有のノード識別子が付与され、前記ノード識別子が、ルート・ノードから始めて、子ノードよりも同じ世代のノードを優先して付与された連続する整数であり、前記ルート・ノード以外の非ルート・ノードの各々のノード識別子に関連付けられた親ノードのノード識別子が格納された親子関係定義配列を記憶する記憶装置を備えたコンピュータにおいて、
第１のツリーの所定のノードの子孫ノード群として第２のツリーを挿入することにより形成された第３のツリーのツリー型データ構造について、前記記憶装置中に新たな親子関係定義配列を生成するために、前記コンピュータにより読み取り可能な情報処理プログラムであって、前記コンピュータに、
前記第１のツリーの第１の親子関係定義配列および前記第２のツリーの第２の親子関係定義配列を前記記憶装置から読み出すステップと、
前記第２のツリーのルート・ノードを前記第１のツリーの前記所定のノードの所定の順位の子ノードとして連結することにより形成される前記第３のツリーの世代毎に、前記第２のツリーに属するノードに隣接する前記第１のツリーに属するノードを特定し、前記第１のツリーに属する前記特定されたノードの情報を前記記憶装置に記憶するステップと、
前記記憶装置に記憶された前記第１のツリーに属する前記特定されたノードの情報を参照して、前記第３のツリーのすべてのノードに、ルート・ノードから始めて、子ノードよりも同じ世代のノードを優先して連続する整数である新たなノード識別子を付与し、前記第１のツリーに属するノードに付与された前記新たなノード識別子を前記第１のツリーのノードのノード識別子に関連付けて格納した第１の新規ノード識別子配列、および、前記第２のツリーに属するノードに付与された前記新たなノード識別子を前記第２のツリーのノード識別子に関連付けて格納した第２の新規ノード識別子配列を前記記憶装置に生成するステップと、
前記第１の親子関係定義配列および第２の親子関係定義配列と前記第１の新規ノード識別子配列および前記第２の新規ノード識別子配列に基づいて、前記第３のツリーの非ルート・ノードの前記新たなノード識別子に関連付けて前記第３のツリーの前記非ルート・ノードのノード識別子を格納することにより、前記新たな親子関係定義配列を前記記憶装置に生成するステップと、
を実行させることを特徴とする情報処理プログラム。
【請求項２９】
前記記憶装置に、前記第１のツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納した第１のノード値格納配列が記憶され、前記第２のツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納した第２のノード値格納配列が記憶され、前記コンピュータに、
前記第１および第２の新規ノード識別子配列を参照して、前記第１のツリーおよび前記第２のツリーのそれぞれのノード識別子と、前記第３のツリーの新たなノード識別子との関連付けにしたがって、前記第１のノード値格納配列および第２のノード配列の少なくとも一方を更新するステップを実行させることを特徴とする請求項２８に記載の情報処理プログラム。
【請求項３０】
前記記憶装置に、前記第１のツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納した第１のノード値格納配列が記憶され、前記第２のツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納した第２のノード値格納配列が記憶され、前記コンピュータに、
前記第１および第２の新規ノード識別子配列を参照して、前記第１のツリーおよび前記第２のツリーのそれぞれのノード識別子と、前記第３のツリーの新たなノード識別子との関連付けにしたがって、前記新たなノード識別子の各々と関連付けて前記ノード値を格納した新たなノード値格納配列を生成するステップを実行させることを特徴とする請求項２８に記載の情報処理プログラム。
【請求項３１】
前記第１のツリーに属する前記特定されたノードの情報を、前記記憶装置に記憶するステップにおいて、前記コンピュータに、
前記第２のツリーのルート・ノードが挿入される位置の情報に基づいて、前記第１の親子関係定義配列と同一のサイズの挿入マーク配列中、前記挿入される位置の直後のノードおよび前記直後のノードを先祖とするノードについて、当該挿入位置であることを示す値を格納するステップを実行させることを特徴とする請求項２８ないし３０の何れか一項に記載の情報処理プログラム。
【請求項３２】
さらに、前記コンピュータに、前記第１のツリーの各ノードの、当該第２のツリーのルート・ノードからの深さのレベルを表すレベル値を格納した第１のレベル配列を、前記記憶装置に生成するステップと、
前記第１のレベル配列中、前記第２のツリーのルート・ノードの挿入位置に相当するレベル値を参照して、前記第２のツリーの各ノードの、前記第１のツリーのルート・ノードからの深さのレベルを表すレベル値を格納した第２のレベル配列を、前記記憶装置に生成するステップと、を実行させ、
前記第１の新規ノード識別子配列および前記第２の新規ノード識別子配列を生成するステップにおいて、前記コンピュータに、
前記第１の親子関係定義配列および前記第２の親子関係定義配列と、それぞれ、同一のサイズである前記第１の新規ノード識別子配列および前記第２の新規ノード識別子配列のための領域を、前記記憶装置中に確保するステップと、
新たなノード識別子を一時的に記憶するカレントノード識別子領域を、前記記憶装置中に確保して、その初期値を格納するステップと、を実行させ、
前記挿入マーク配列中、その値が、挿入位置であることを示す値に変化している位置以外の位置においては、さらに、前記コンピュータに、
（ａ）前記第１の新規ノード識別子配列中、当該位置の値として、前記カレントノード識別子領域の値を格納し、
（ｂ）その後、前記カレントノード識別子領域の値を増分する
ステップを実行させ、
前記挿入マーク配列中、当該挿入マーク配列の値が、挿入位置であることを示す値に変化する位置においては、さらに、前記コンピュータに、
（ａ）前記第１のレベル配列中、当該位置のレベル値を参照し、かつ、前記第２のレベル配列中、同一のレベル値を有する範囲を特定し、
（ｂ）前記第２の新規ノード識別子配列中、当該範囲の先頭位置から順次、カレントノード識別子領域の値を格納し、
（ｃ）その後、前記カレントノード識別子領域の値を増分し、
（ｄ）前記第２の新規ノード識別子配列中、前記同一のレベル値を有する範囲への値の格納が終了すると、第１の新規ノード識別子配列の値として、前記カレントノード識別子領域の値を格納し、
（ｅ）その後、前記カレントノード識別子領域の値を増分するステップを実行させることを特徴とする請求項３１に記載の情報処理プログラム。
【請求項３３】
前記新たな親子関係定義配列を生成するステップにおいて、前記コンピュータに、
前記新たな第１の親子関係定義配列と少なくとも同一サイズであるの、第１の親ノード識別子配列のための領域および第２の親ノード識別子配列のための領域を、前記記憶装置中に確保するステップと、
前記第１の新規ノード識別子配列中、前記第１の親子関係定義配列の値が示す位置の値を参照して、前記第１の親ノード識別子配列中、前記親子関係定義配列の値の位置と同じ位置に、前記第１の新規ノード識別子配列の値を格納するステップと、
前記第１の新規ノード識別子配列の値と、前記第１の親ノード識別子配列の値とを関連付けるステップと、
前記第２の親子関係定義配列と同一サイズの、第２の親ノード識別配列のための領域を、前記記憶装置中に確保するステップと、
前記第２の新規ノード識別子配列中、先頭の値として、前記挿入側ノードの頂点ノードの親ノードとなるノードのノード識別子を格納するともに、他の値として、前記第２の親子関係定義配列の値が示す位置の値を参照して、前記第２の親ノード識別子配列中、前記親子関係定義配列の値の位置と同じ位置に、前記第２の新規ノード識別子配列の値を格納するステップと、
前記第２の新規ノード識別子配列の値と、前記第２の親ノード識別子配列の値とを関連付けるステップと、
前記第１の親子関係定義配列によって関連付けられている子ノードのノード識別子および親ノードのノード識別子を、前記第１の新規ノード識別子配列を用いて、前記子ノードの新たなノード識別子及び前記親ノードの新たなノード識別子に変換するステップと、
前記第１の親ノード識別子配列中の前記子ノードの新たなノード識別子の値に対応する位置に前記親ノードの新たなノード識別子を格納するステップと、
前記第２の親子関係定義配列によって関連付けられている子ノードのノード識別子および親ノードのノード識別子を、前記第２の新規ノード識別子配列を用いて、前記子ノードの新たなノード識別子及び前記親ノードの新たなノード識別子に変換するステップと、
前記第２の親ノード識別子配列中の前記子ノードの新たなノード識別子の値に対応する位置に前記親ノードの新たなノード識別子を格納するステップと、
前記第１の新規ノード識別子配列の値および前記第２の新規ノード識別子配列の値のそれぞれに関連付けられた、前記第１の親ノード識別子配列の値および前記第２の親ノード識別子配列の値を重ね合わせることにより前記新たな、挿入後の親子関係定義配列を生成に格納するステップと、
を実行させることを特徴とする請求項２８ないし３２の何れか一項に記載の情報処理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はツリー型データ構造を取り扱う方法、特に、ツリーから部分ツリーを削除する方法、あるツリーに他のツリーを挿入する方法、これら方法を実施する情報処理装置、並びに、これら方法をコンピュータに実行させるプログラムに関する。
【背景技術】
【０００２】
データベースは種々の用途に用いられているが、中規模ないし大規模システムにおいては、論理的な矛盾が排除できるリレーショナルデータベース（ＲＤＢ）の使用が主流となっている。たとえば、ＲＤＢは飛行機の座席予約等のシステムに利用されている。この場合、キー項目を指定することにより、（多くの場合１件の）ターゲットを迅速に検索することもでき、或いは、予約の確定、キャンセル或いは変更などを行うことができる。また、各便の座席数はせいぜい数百であるため、特定の航空便の空席数を求めることも可能である。【０００３】
このようなＲＤＢは、表形式データの取り扱いに適しているが、ツリー形式データの取り扱いには適していないことが知られている（例えば、非特許文献１を参照。）。【０００４】
更に、アプリケーションの中には、表形式による表現よりもツリー形式による表現の方が適しているものが存在する。特に、近年、イントラネットやインターネットのアプリケーションのデータ標準として、ツリー型データ構造を採用するＸＭＬが普及している（ＸＭＬの詳細については、例えば、非特許文献２を参照。）。【０００５】
しかし、ツリー型データ構造の取り扱い、例えば、ツリー形式データの検索は、一般に、大変効率が悪い。この効率の悪さの第１の理由は、データが各所のノードに分散して存在するため、データの存在すべき場所を直ちに特定することが困難である点にある。ＲＤＢでは、例えば、「年齢」というデータは、あるテーブルの「年齢」という項目だけに格納されている。しかし、ツリー型データ構造では、「年齢」というデータを保持するノードが各所に散在しているので、一般的には、ツリー型データ構造の全体を調べなければ、該当するデータを検索することができない。【０００６】
効率の悪さの第２の理由は、検索の結果を表現するために時間がかかるという点にある。検索にヒットしたノード群を表現しようとすると、屡々、そのノードの子孫にあたるノードも表現しなければならないが、ＲＤＢＭＳとは異なりデータ構造が非定型であるため、子孫ノードを表現するために時間がかかる。【０００７】
そこで、データベースの主流であるＲＤＢの利点をいかすため、従来、ツリー型データ構造をデータベース化するとき、ツリー形式データをＲＤＢ化する方法（例えば、特許文献１を参照。）が提案されている。ＲＤＢでは、データはテーブル（表）に分解して保持される。そのため、実際のツリー形式データをＲＤＢ化するには、ツリー形式データをテーブルに押し込める必要がある。しかし、様々のツリー型データ構造を取り扱うためには、その構造毎に個別にデータをテーブルに押し込め、システム設計を行わなければならない。したがって、ＲＤＢに基づくシステム構築は非常に手間のかかる作業である。【０００８】
これに対して、ツリー形式データ、特に、ＸＭＬデータをそのままの形でデータベース化する方法も提案されている。ツリー型データ構造の場合、一つのノードに子孫ノードをぶら下げることができ、多様な表現が可能であるため、システム設計の手間を大幅に削減することができる。したがって、ＸＭＬのようなツリー構造を取り扱える技術を核として、ツリー形式データを処理することへのニーズが高まっている。【０００９】
ＸＭＬデータをそのままの形でデータベース化する方法の一例のアプローチは、ツリー構造に記入されているデータのコピーを取り出し、例えば、「年齢」という項目であれば、「年齢」の検索用インデックスデータを別途保持する（例えば、特許文献２を参照。）。これにより、データ自身に属性を付加できるというＸＭＬデータのメリットを十分に活用すると共に、タグを用いて表現された各項目の関係構造をそのまま記憶できるようにしている。【００１０】
また、ＸＭＬ文書をツリー構造でメモリ上に展開するためのＤＯＭと呼ばれるオブジェクトモデルのインタフェースが公開されている（例えば、非特許文献３を参照。）。
【特許文献１】特開２００３−２４８６１５号公報
【特許文献２】特開２００１−１９５４０６号公報
【非特許文献１】株式会社セック、"Karearea White Paper"、[online]、［平成１６年２月１９日検索］、インターネット＜URL:http://www.sec.co.jp/products/karearea/＞
【非特許文献２】W3C、"Extensible Markup Language (XML) 1.0 (Third Edition)"、[online]、２００４年２月４日、［平成１６年２月１９日検索］、インターネット＜URL:http://www.w3.org/TR/2004/REC-xml-20040204/＞
【非特許文献３】Ｒ．  アラン  ワイク、ブラッド  ルーペン、サルタン  ルーマン、「プログラミングＸＭＬ」、日経ＤＰソフトプレス、２００２年、第５９頁−第８４頁
【発明の開示】
【発明が解決しようとする課題】
【００１１】
しかし、上記の検索用インデックスデータを別途保持するようなアプローチでは、少なくともデータは二重に保持され、かつ、インデックスを作成するコスト及びインデックスを格納するためのデータ領域が必要となり、大規模なデータを保持する上で不利である。【００１２】
このようなメカニズムによって、実際に検索を行い、ノードを特定したとしても、そのノードを表現するためには時間がかかる。また、このメカニズムは、ノード間の関係を問題とする検索（例えば、祖先に「６０歳」という「年齢」を含み、子孫に「１歳」という「年齢」を含むツリーの抽出）には利用できない。【００１３】
このような従来技術の根本的な問題点は、個々のデータのみに着目し、データを蓄えたノード間をポインタで接続することによりツリー型データ構造が表現されているため、データ間の関係、例えば、親子、祖先、子孫、兄弟（シブリング）、世代などの関係を効率的にトレースすることができないことにある。換言すると、ポインタは、その値が一定しないため、データの格納アドレスを示すという用途にしか使用できず、ノード間の関係を直接的に表現することができない。その結果として、従来技術では、ツリー型データ構造のトポロジーを編集すること、特に、ツリー構造型データのあるノードに子孫ノードを挿入することが困難であった。また、上記のＤＯＭは、ツリー型データ構造のトポロジーを編集する操作のインタフェースを規定するだけであり、操作の具体的手法を規定するものではない。【００１４】
そこで、本発明は、効率的にツリーから、当該ツリーの一部分である部分ツリーを削除し、また、あるツリーに他のツリーを挿入する方法、情報処理装置、および、プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１５】
上記目的を達成するため、本発明は、ツリー型データ構造を構成するノード間の親子関係を、親ノードに子ノードを対応付ける「親→子」関係ではなく、子ノードに親ノードを対応付ける「子→親」関係によって表現した親子関係定義配列を用いて、挿入や削除を実現する。【００１６】
従来から知られている「親→子」関係によって親子関係を表現する場合、一つの親ノードに複数の子ノードが対応する場合があるので、親ノードと子ノードの二つの要素を特定しなければ親子関係を定義できない。即ち、親ノードを特定しても、その親ノードと親子関係にある子ノードを特定することができない。これに対して、本発明のように「子→親」関係によって親子関係を表現する場合、一つの子ノードには必ず唯一の親ノードが対応するので、子ノードを特定することによって、この子ノードに対応する唯一の親ノードを直ちに特定することができる。【００１７】
より詳細には、本発明の目的は、ツリー型データ構造を表すために、ルート・ノードを含むノードに付与されたノード識別子であって、親子関係にあるノードについて、親ノードのノード識別子は、子ノードのノード識別子より小さいという関係を満たす、連続する整数であるノード識別子を用いて、前記ルート・ノード以外のノードである非ルート・ノードの各々に付与されたノード識別子に関連付けて、前記非ルート・ノードの各々の親ノードに付与されたノード識別子を格納した、記憶装置中に生成された親子関係定義配列を備えた情報処理装置において、
あるツリーから、特定のノードである頂点ノードおよびその子孫ノードからなる部分ツリーを削除し、かつ、当該部分ツリー削除後のツリーのツリー型データ構造について、前記記憶装置中に親子関係定義配列を生成する情報処理方法であって、
前記部分ツリーを削除すべきツリーの親子関係定義配列を、前記記憶装置から読み出すステップと、
前記部分ツリーにおいて最もルート・ノードに近い位置にある頂点ノードのノード識別子、および、前記親子関係定義配列を参照して、記憶装置に生成された、前記親子関係定義配列と同一サイズの消去フラグ配列中、前記部分ツリーを構成するノードのノード識別子について、当該フラグをセットするステップと、
前記消去フラグ配列を参照して、前記部分ツリーの削除後のツリーについて、それぞれのノードに、親子関係にあるノードについて、親ノードのノード識別子は、子ノードのノード識別子より小さいという関係を満たす連続する整数であるノード識別子を付与し、付与された新たなノード識別子を、削除前のツリーのノードのノード識別子と関連付けて格納した新規ノード識別子配列を、記憶装置に生成するステップと、
前記親子関係定義配列および前記新規ノード識別子配列に基づいて、前記新たなノード識別子に関連付けて、当該ノード識別子をもつノードの親ノードのノード識別子を格納した、部分ツリー削除後の親子関係定義配列を、前記記憶装置に生成するステップと、
を備えたことを特徴とする情報処理方法により達成される。【００１８】
好ましい実施態様においては、前記ノード識別子が、子ノードよりも同じ世代のノードを優先して付与された連続する整数であり、前記ルート・ノード以外のノードである非ルート・ノードの各々に付与されたノード識別子に関連付けて、前記非ルート・ノードの各々の親ノードに付与されたノード識別子を格納した親子関係定義配列が、前記記憶装置中に記憶され、
前記新規ノード識別子配列を生成するステップが、前記それぞれのノードに、子ノードより同じ世代のノードを優先して付与された連続する整数であるノード識別子を付与するステップを含む。【００１９】
或いは、前記ノード識別子が、同じ世代のノードよりも子ノードを優先して付与された連続する整数であり、前記ルート・ノード以外のノードである非ルート・ノードの各々に付与されたノード識別子に関連付けて、前記非ルート・ノードの各々の親ノードに付与されたノード識別子を格納した親子関係定義配列が、前記記憶装置中に記憶され、
前記新規ノード識別子配列を生成するステップが、前記それぞれのノードに、同じ世代のノードより子ノードを優先して付与された整数であるノード識別子を付与するステップを含んでいてもよい。【００２０】
また、好ましい実施態様においては、前記記憶装置に、前記ツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納したノード値格納配列が記憶され、
前記新規ノード識別子配列を参照して、もとのノード識別子と新たなノード識別子との関連付けにしたがって、前記ノード値格納配列を更新するステップを備えている。【００２１】
他の好ましい実施態様においては、前記記憶装置に、前記ツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納したノード値格納配列が記憶され、
前記新規ノード識別子配列を参照して、もとのノード識別子と新たなノード識別子との関連付けにしたがって、新たなノード識別子の各々と関連付けて、前記ノード値を格納した、新たなノード値格納配列を生成するステップを備えている。【００２２】
より好ましい実施態様においては、前記新規ノード識別子配列を生成するステップが、
前記親子関係定義配列と同一のサイズの新規ノード識別子配列のための領域を、前記記憶装置中に確保するステップと、
新たなノード識別子を一時的に記憶するカレントノード識別子領域を、前記記憶装置中に確保して、その初期値を格納するステップと、
前記消去フラグ配列を参照して、前記消去フラグ配列の値がセットされていない場合には、当該新規ノード識別子配列の値として、前記カレントノード識別子領域の値を格納し、その後、前記カレントノード識別子領域の値を増分し、その一方、消去フラグ配列の値がセットされている場合には、当該新規ノード識別子配列の値として無効値を格納するステップと、を備えている。【００２３】
別の好ましい実施態様においては、前記部分ツリー削除後の親子関係定義配列を生成するステップが、
前記親子関係定義配列と同一サイズの格納アドレス配列のための領域を、前記記憶装置中に確保するステップと、
前記新規ノード識別子配列中、前記親子関係定義配列の値の格納位置と同じ位置の値を参照して、値が無効値である場合を除き、前記格納アドレス配列に、前記新規ノード識別子配列中の値を格納するステップと、
前記親子関係定義配列と同一サイズの親ノード識別子配列のための領域を、前記記憶装置中に確保するステップと、
前記新規ノード識別子配列中、前記親子関係定義配列の値が示す位置の値を参照して、前記親ノード識別子配列中、前記親子関係定義配列の値の位置と同じ位置に、前記新規ノード識別子配列の値を格納するステップと、
前記格納アドレス配列中の値に関連付けて、前記親ノード識別子配列の値を格納した親子関係定義配列を生成するステップと、を含む。【００２４】
また、本発明の目的は、ツリー型データ構造を表すために、ルート・ノードを含むノードに付与された固有のノード識別子であって、子ノードよりも同じ世代のノードを優先して付与された連続する整数であるノード識別子を用いて、前記ルート・ノード以外のノードである非ルート・ノードの各々に付与されたノード識別子に関連付けて、前記非ルート・ノードの各々の親ノードに付与されたノード識別子を格納した、記憶装置中に生成された親子関係定義配列を備えた情報処理装置において、
あるツリーを被挿入側ツリーとして、当該被挿入側ツリーの特定のノードに、他のツリーである挿入側ツリーのルート・ノードを連結することにより、当該挿入側ツリーを追加し、当該挿入後のツリーのツリー型データ構造について、前記記憶装置中に親子関係定義配列を生成する情報処理方法であって、
被挿入側ツリーの第１の親子関係定義配列、および、挿入側ツリーの第２の親子関係定義配列を記憶装置から読み出すステップと、
前記挿入側ツリーのルート・ノードを、被挿入側ツリーの部分ツリー中、最もルート・ノードに近い位置にある頂点ノードとして、当該頂点ノードが挿入される位置の情報に基づいて、挿入側ツリーのそれぞれのノードに隣接する、被挿入側ツリーのノードを特定し、当該被挿入側ツリーのノードの情報を、前記記憶装置に記憶するステップと、
前記被挿入側ツリーのノードの情報を参照して、前記挿入側ツリーの挿入後の前記被挿入側ツリーについて、それぞれのノードに、子ノードよりも同じ世代のノードを優先して付与された連続する整数であるノード識別子を付与し、付与された新たなノード識別子を、挿入前の被挿入側ツリーのノードのノード識別子と関連付けて格納した第１の新規ノード識別子配列を、前記記憶装置に生成するとともに、前記挿入側ツリーの頂点ノードが挿入される位置の情報に基づいて、前記挿入側ツリーの挿入後の前記挿入側ツリーについて、それぞれのノードに、子ノードよりも同じ世代のノードを優先して付与された連続する整数であるノード識別子を付与し、付与された新たなノード識別子を、挿入前の挿入側ツリーのノードのノード識別子と関連付けて格納した第２の新規ノード識別子配列を、前記記憶装置に生成するステップと、
前記第１および第２の親子関係定義配列、および、前記第１および第２の新規ノード識別子配列に基づいて、前記新たなノード識別子に関連付けて、当該ノード識別子をもつノードの親ノードのノード識別子を格納した、挿入後のツリーの親子関係定義配列を、前記記憶装置に生成するステップと、
を備えたことを特徴とする情報処理方法により達成される。【００２５】
好ましい実施態様においては、前記記憶装置に、前記被挿入側ツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納した第１のノード値格納配列が記憶され、前記挿入側ツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納した第２のノード値格納配列が記憶され、
前記第１および第２の新規ノード識別子配列を参照して、被挿入側ツリーおよび挿入側ツリーのそれぞれのもとのノード識別子と、挿入後のツリーの新たなノード識別子との関連付けにしたがって、前記第１のノード値格納配列および第２のノード配列の少なくとも一方を更新するステップを備えている。【００２６】
他の好ましい実施態様においては、前記記憶装置に、前記被挿入側ツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納した第１のノード値格納配列が記憶され、前記挿入側ツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納した第２のノード値格納配列が記憶され、
前記第１および第２の新規ノード識別子配列を参照して、被挿入側ツリーおよび挿入側ツリーのそれぞれのもとのノード識別子と、挿入後のツリーの新たなノード識別子との関連付けにしたがって、新たなノード識別子の各々と関連付けて、前記ノード値を格納した、新たなノード値格納配列を生成するステップを備えている。【００２７】
より好ましい実施態様においては、前記被挿入側ツリーのノードの情報を、前記記憶装置に記憶するステップが、
前記挿入側ツリーの頂点ノードが挿入される位置の情報に基づいて、前記第１の親子関係定義配列と同一のサイズの挿入マーク配列中、前記挿入される位置の直後のノードおよび前記直後のノードを先祖とするノードについて、当該挿入位置であることを示す値を格納するステップを含む。【００２８】
また、別の好ましい実施態様においては、さらに、前記被挿入側ツリーの各ノードの、当該被挿入側ツリーの頂点ノードからの深さのレベルを表すレベル値を格納した第１のレベル配列を、前記記憶装置に生成するステップと、
前記第１のレベル配列中、前記挿入側ツリーの頂点ノードの挿入位置に相当するレベル値を参照して、前記挿入側ツリーの各ノードの、前記被挿入側ツリーの頂点ノードからの深さのレベルを表すレベル値を格納した第２のレベル配列を、前記記憶装置に生成するステップと、を備え、
前記第１および第２の新規ノード識別子配列を生成するステップが、
前記第１および第２の親子関係定義配列と、それぞれ、同一のサイズの第１および第２の新規ノード識別子配列のための領域を、前記記憶装置中に確保するステップと、
新たなノード識別子を一時的に記憶するカレントノード識別子領域を、前記記憶装置中に確保して、その初期値を格納するステップと、を含み、
前記挿入マーク配列中、その値が、挿入位置であることを示す値に変化している位置以外の位置においては、
（ａ）前記第１の新規ノード識別子配列中、当該位置の値として、前記カレントノード識別子領域の値を格納し、
（ｂ）その後、前記カレントノード識別子領域の値を増分する
ステップをさらに含み、
前記挿入マーク配列中、当該挿入マーク配列の値が、挿入位置であることを示す値に変化する位置においては、
（ａ）前記第１のレベル配列中、当該位置のレベル値を参照し、かつ、前記第２のレベル配列中、同一のレベル値を有する範囲を特定し、
（ｂ）前記第２の新規ノード識別子配列中、当該範囲の先頭位置から順次、カレントノード識別子領域の値を格納し、
（ｃ）その後、前記カレントノード識別子領域の値を増分し、
（ｄ）前記第２の新規ノード識別子配列中、前記同一のレベル値を有する範囲への値の格納が終了すると、第１の新規ノード識別子配列の値として、前記カレントノード識別子領域の値を格納し、
（ｅ）その後、前記カレントノード識別子領域の値を増分する
ステップを、さらに含む。【００２９】
また、より好ましい実施態様においては、前記ツリー挿入後の親子関係定義配列を生成するステップが、
前記第１の親子関係定義配列と同一サイズの、第１の親ノード識別子配列のための領域を、前記記憶装置中に確保するステップと、
前記第１の新規ノード識別子配列中、前記第１の親子関係定義配列の値が示す位置の値を参照して、前記第１の親ノード識別子配列中、前記親子関係定義配列の値の位置と同じ位置に、前記第１の新規ノード識別子配列の値を格納するステップと、
前記第１の新規ノード識別子配列の値と、前記第１の親ノード識別子配列の値とを関連付けるステップと、
前記第２の親子関係定義配列と同一サイズの、第２の親ノード識別配列のための領域を、前記記憶装置中に確保するステップと、
前記第２の新規ノード識別子配列中、先頭の値として、前記挿入側ノードの頂点ノードの親ノードとなるノードのノード識別子を格納するともに、他の値として、前記第２の親子関係定義配列の値が示す位置の値を参照して、前記第２の親ノード識別子配列中、前記親子関係定義配列の値の位置と同じ位置に、前記第２の新規ノード識別子配列の値を格納するステップと、
前記第２の新規ノード識別子配列の値と、前記第２の親ノード識別子配列の値とを関連付けるステップと、
前記第１の新規ノード識別子配列の値および前記第２の新規ノード識別子配列の値のそれぞれに関連付けられた、前記第１の親ノード識別子配列の値および第２の親ノード識別子配列の値を、挿入後の親子関係定義配列に格納するステップと、を含む。【００３０】
また、本発明の目的は、ツリー型データ構造を表すために、ルート・ノードを含むノードに付与されたノード識別子であって、親子関係にあるノードについて、親ノードのノード識別子は、子ノードのノード識別子より小さいという関係を満たす、連続する整数であるノード識別子を用いて、前記ルート・ノード以外のノードである非ルート・ノードの各々に付与されたノード識別子に関連付けて、前記非ルート・ノードの各々の親ノードに付与されたノード識別子を格納した、記憶装置中に生成された親子関係定義配列を備え、あるツリーから、特定のノードである頂点ノードおよびその子孫ノードからなる部分ツリーを削除し、かつ、当該部分ツリー削除後のツリーのツリー型データ構造について、前記記憶装置中に親子関係定義配列を生成するように構成された情報処理装置において、
前記部分ツリーを削除すべきツリーの親子関係定義配列を、前記記憶装置から読み出すデータ読み出し手段と、
前記部分ツリーにおいて最もルート・ノードに近い位置にある頂点ノードのノード識別子、および、前記親子関係定義配列を参照して、記憶装置に生成された、前記親子関係定義配列と同一サイズの消去フラグ配列中、前記部分ツリーを構成するノードのノード識別子について、当該フラグをセットする消去フラグ配列生成手段と、
前記消去フラグ配列を参照して、前記部分ツリーの削除後のツリーについて、それぞれのノードに、親子関係にあるノードについて、親ノードのノード識別子は、子ノードのノード識別子より小さいという関係を満たす連続する整数であるノード識別子を付与し、付与された新たなノード識別子を、削除前のツリーのノードのノード識別子と関連付けて格納した新規ノード識別子配列を、記憶装置に生成する新規ノード識別子配列生成手段と、
前記親子関係定義配列および前記新規ノード識別子配列に基づいて、前記新たなノード識別子に関連付けて、当該ノード識別子をもつノードの親ノードのノード識別子を格納した、部分ツリー削除後の親子関係定義配列を、前記記憶装置に生成する削除後親子関係配列生成手段と、
を備えたことを特徴とする情報処理装置により達成される。【００３１】
好ましい実施態様においては、前記ノード識別子が、子ノードよりも同じ世代のノードを優先して付与された連続する整数であり、前記ルート・ノード以外のノードである非ルート・ノードの各々に付与されたノード識別子に関連付けて、前記非ルート・ノードの各々の親ノードに付与されたノード識別子を格納した親子関係定義配列が、前記記憶装置中に記憶され、
前記新規ノード識別子生成手段が、前記それぞれのノードに、子ノードより同じ世代のノードを優先して付与された連続する整数であるノード識別子を付与するように構成されている。【００３２】
或いは、他の好ましい実施態様においては、前記ノード識別子が、同じ世代のノードよりも子ノードを優先して付与された連続する整数であり、前記ルート・ノード以外のノードである非ルート・ノードの各々に付与されたノード識別子に関連付けて、前記非ルート・ノードの各々の親ノードに付与されたノード識別子を格納した親子関係定義配列が、前記記憶装置中に記憶され、
前記新規ノード生成手段が、前記それぞれのノードに、同じ世代のノードより子ノードを優先して付与された連続する整数であるノード識別子を付与するように構成されている。【００３３】
また、好ましい実施態様においては、前記記憶装置に、前記ツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納したノード値格納配列が記憶され、
前記新規ノード識別子配列を参照して、もとのノード識別子と新たなノード識別子との関連付けにしたがって、前記ノード値格納配列を更新するノード値格納配列更新手段を備えている。【００３４】
他の好ましい実施態様においては、前記記憶装置に、前記ツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納したノード値格納配列が記憶され、
前記新規ノード識別子配列を参照して、もとのノード識別子と新たなノード識別子との関連付けにしたがって、新たなノード識別子の各々と関連付けて、前記ノード値を格納した、新たなノード値格納配列を生成するノード値格納配列生成手段を備えている。【００３５】
より好ましい実施態様においては、前記新規ノード識別子配列生成手段が、
前記親子関係定義配列と同一のサイズの新規ノード識別子配列のための領域を、前記記憶装置中に確保し、
新たなノード識別子を一時的に記憶するカレントノード識別子領域を、前記記憶装置中に確保して、その初期値を格納し、
前記消去フラグ配列を参照して、前記消去フラグ配列の値がセットされていない場合には、当該新規ノード識別子配列の値として、前記カレントノード識別子領域の値を格納し、その後、前記カレントノード識別子領域の値を増分し、その一方、消去フラグ配列の値がセットされている場合には、当該新規ノード識別子配列の値として無効値を格納するように構成されている。【００３６】
別の好ましい実施態様においては、前記削除後親子関係定義配列生成手段が、
前記親子関係定義配列と同一サイズの格納アドレス配列のための領域を、前記記憶装置中に確保し、
前記新規ノード識別子配列中、前記親子関係定義配列の値の格納位置と同じ位置の値を参照して、値が無効値である場合を除き、前記格納アドレス配列に、前記新規ノード識別子配列中の値を格納し、
前記親子関係定義配列と同一サイズの親ノード識別子配列のための領域を、前記記憶装置中に確保し、
前記新規ノード識別子配列中、前記親子関係定義配列の値が示す位置の値を参照して、前記親ノード識別子配列中、前記親子関係定義配列の値の位置と同じ位置に、前記新規ノード識別子配列の値を格納し、
前記格納アドレス配列中の値に関連付けて、前記親ノード識別子配列の値を格納した親子関係定義配列を生成するように構成されている。【００３７】
また、本発明の目的は、ツリー型データ構造を表すために、ルート・ノードを含むノードに付与された固有のノード識別子であって、子ノードよりも同じ世代のノードを優先して付与された連続する整数であるノード識別子を用いて、前記ルート・ノード以外のノードである非ルート・ノードの各々に付与されたノード識別子に関連付けて、前記非ルート・ノードの各々の親ノードに付与されたノード識別子を格納した、記憶装置中に生成された親子関係定義配列を備えた情報処理装置であって、あるツリーを被挿入側ツリーとして、当該被挿入側ツリーの特定のノードに、他のツリーである挿入側ツリーのルート・ノードを連結することにより、当該挿入側ツリーを追加し、当該挿入後のツリーのツリー型データ構造について、前記記憶装置中に親子関係定義配列を生成するように構成された情報処理装置において、
被挿入側ツリーの第１の親子関係定義配列、および、挿入側ツリーの第２の親子関係定義配列を記憶装置から読み出すデータ読み出し手段と、
前記挿入側ツリーのルート・ノードを、被挿入側ツリーの部分ツリー中、最もルート・ノードに近い位置にある頂点ノードとして、当該頂点ノードが挿入される位置の情報に基づいて、挿入側ツリーのそれぞれのノードに隣接する、被挿入側ツリーのノードを特定し、当該被挿入側ツリーのノードの情報を、前記記憶装置に記憶する挿入位置情報生成手段と、
前記被挿入側ツリーのノードの情報を参照して、前記挿入側ツリーの挿入後の前記被挿入側ツリーについて、それぞれのノードに、子ノードよりも同じ世代のノードを優先して付与された連続する整数であるノード識別子を付与し、付与された新たなノード識別子を、挿入前の被挿入側ツリーのノードのノード識別子と関連付けて格納した第１の新規ノード識別子配列を、前記記憶装置に生成するとともに、前記挿入側ツリーの頂点ノードが挿入される位置の情報に基づいて、前記挿入側ツリーの挿入後の前記挿入側ツリーについて、それぞれのノードに、子ノードよりも同じ世代のノードを優先して付与された連続する整数であるノード識別子を付与し、付与された新たなノード識別子を、挿入前の挿入側ツリーのノードのノード識別子と関連付けて格納した第２の新規ノード識別子配列を、前記記憶装置に生成する新規ノード識別子配列生成手段と、
前記第１および第２の親子関係定義配列、および、前記第１および第２の新規ノード識別子配列に基づいて、前記新たなノード識別子に関連付けて、当該ノード識別子をもつノードの親ノードのノード識別子を格納した、挿入後のツリーの親子関係定義配列を、前記記憶装置に生成する挿入後親子関係定義配列生成手段と、
を備えたことを特徴とする情報処理装置によっても達成される。【００３８】
好ましい実施態様においては、前記記憶装置に、前記被挿入側ツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納した第１のノード値格納配列が記憶され、前記挿入側ツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納した第２のノード値格納配列が記憶され、
前記第１および第２の新規ノード識別子配列を参照して、被挿入側ツリーおよび挿入側ツリーのそれぞれのもとのノード識別子と、挿入後のツリーの新たなノード識別子との関連付けにしたがって、前記第１のノード値格納配列および第２のノード配列の少なくとも一方を更新するノード値格納配列更新手段を備えている。【００３９】
他の好ましい実施態様においては、前記記憶装置に、前記被挿入側ツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納した第１のノード値格納配列が記憶され、前記挿入側ツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納した第２のノード値格納配列が記憶され、
前記第１および第２の新規ノード識別子配列を参照して、被挿入側ツリーおよび挿入側ツリーのそれぞれのもとのノード識別子と、挿入後のツリーの新たなノード識別子との関連付けにしたがって、新たなノード識別子の各々と関連付けて、前記ノード値を格納した、新たなノード値格納配列を生成するノード値格納配列生成手段を備えている。【００４０】
より好ましい実施態様においては、前記挿入位置情報生成手段が、
前記挿入側ツリーの頂点ノードが挿入される位置の情報に基づいて、前記第１の親子関係定義配列と同一のサイズの挿入マーク配列中、前記挿入される位置の直後のノードおよび前記直後のノードを先祖とするノードについて、当該挿入位置であることを示す値を格納するように構成されている。【００４１】
また、別の好ましい実施態様においては、さらに、前記被挿入側ツリーの各ノードの、当該被挿入側ツリーの頂点ノードからの深さのレベルを表すレベル値を格納した第１のレベル配列を、前記記憶装置に生成する第１のレベル配列生成手段と、
前記第１のレベル配列中、前記挿入側ツリーの頂点ノードの挿入位置に相当するレベル値を参照して、前記挿入側ツリーの各ノードの、前記被挿入側ツリーの頂点ノードからの深さのレベルを表すレベル値を格納した第２のレベル配列を、前記記憶装置に生成する第２のレベル配列生成手段と、を備え、
前記新規ノード識別子配列生成手段が、
前記第１および第２の親子関係定義配列と、それぞれ、同一のサイズの第１および第２の新規ノード識別子配列のための領域を、前記記憶装置中に確保し、
新たなノード識別子を一時的に記憶するカレントノード識別子領域を、前記記憶装置中に確保して、その初期値を格納するように構成され、
前記挿入マーク配列中、その値が、挿入位置であることを示す値に変化している位置以外の位置においては、
（ａ）前記第１の新規ノード識別子配列中、当該位置の値として、前記カレントノード識別子領域の値を格納するとともに、
（ｂ）その後、前記カレントノード識別子領域の値を増分するように構成され、
前記挿入マーク配列中、当該挿入マーク配列の値が、挿入位置であることを示す値に変化する位置においては、
（ａ）前記第１のレベル配列中、当該位置のレベル値を参照し、かつ、前記第２のレベル配列中、同一のレベル値を有する範囲を特定し、
（ｂ）前記第２の新規ノード識別子配列中、当該範囲の先頭位置から順次、カレントノード識別子領域の値を格納し、
（ｃ）その後、前記カレントノード識別子領域の値を増分し、
（ｄ）前記第２の新規ノード識別子配列中、前記同一のレベル値を有する範囲への値の格納が終了すると、第１の新規ノード識別子配列の値として、前記カレントノード識別子領域の値を格納し、
（ｅ）その後、前記カレントノード識別子領域の値を増分するように構成されている。【００４２】
また、さらに別の好ましい実施態様においては、前記挿入後親子関係定義配列生成手段が、
前記第１の親子関係定義配列と同一サイズの、第１の親ノード識別子配列のための領域を、前記記憶装置中に確保し、
前記第１の新規ノード識別子配列中、前記第１の親子関係定義配列の値が示す位置の値を参照して、前記第１の親ノード識別子配列中、前記親子関係定義配列の値の位置と同じ位置に、前記第１の新規ノード識別子配列の値を格納し、
前記第１の新規ノード識別子配列の値と、前記第１の親ノード識別子配列の値とを関連付け、
前記第２の親子関係定義配列と同一サイズの、第２の親ノード識別配列のための領域を、前記記憶装置中に確保し、
前記第２の新規ノード識別子配列中、先頭の値として、前記挿入側ノードの頂点ノードの親ノードとなるノードのノード識別子を格納するともに、他の値として、前記第２の親子関係定義配列の値が示す位置の値を参照して、前記第２の親ノード識別子配列中、前記親子関係定義配列の値の位置と同じ位置に、前記第２の新規ノード識別子配列の値を格納し、
前記第２の新規ノード識別子配列の値と、前記第２の親ノード識別子配列の値とを関連付け、
前記第１の新規ノード識別子配列の値および前記第２の新規ノード識別子配列の値のそれぞれに関連付けられた、前記第１の親ノード識別子配列の値および第２の親ノード識別子配列の値を、挿入後の親子関係定義配列に格納するように構成されている。【００４３】
また、本発明の目的は、ツリー型データ構造を表すために、ルート・ノードを含むノードに付与されたノード識別子であって、親子関係にあるノードについて、親ノードのノード識別子は、子ノードのノード識別子より小さいという関係を満たす、連続する整数であるノード識別子を用いて、前記ルート・ノード以外のノードである非ルート・ノードの各々に付与されたノード識別子に関連付けて、前記非ルート・ノードの各々の親ノードに付与されたノード識別子を格納した、記憶装置中に生成された親子関係定義配列を備えたコンピュータにおいて、
あるツリーから、特定のノードである頂点ノードおよびその子孫ノードからなる部分ツリーを削除し、かつ、当該部分ツリー削除後のツリーのツリー型データ構造について、前記記憶装置中に親子関係定義配列を生成するために、前記コンピュータにより読み出し可能な情報処理プログラムであって、前記コンピュータに、
前記部分ツリーを削除すべきツリーの親子関係定義配列を、前記記憶装置から読み出すステップと、
前記部分ツリーにおいて最もルート・ノードに近い位置にある頂点ノードのノード識別子、および、前記親子関係定義配列を参照して、記憶装置に生成された、前記親子関係定義配列と同一サイズの消去フラグ配列中、前記部分ツリーを構成するノードのノード識別子について、当該フラグをセットするステップと、
前記消去フラグ配列を参照して、前記部分ツリーの削除後のツリーについて、それぞれのノードに、親子関係にあるノードについて、親ノードのノード識別子は、子ノードのノード識別子より小さいという関係を満たす連続する整数であるノード識別子を付与し、付与された新たなノード識別子を、削除前のツリーのノードのノード識別子と関連付けて格納した新規ノード識別子配列を、記憶装置に生成するステップと、
前記親子関係定義配列および前記新規ノード識別子配列に基づいて、前記新たなノード識別子に関連付けて、当該ノード識別子をもつノードの親ノードのノード識別子を格納した、部分ツリー削除後の親子関係定義配列を、前記記憶装置に生成するステップと、
を実行させることを特徴とする情報処理プログラムにより達成される。【００４４】
好ましい実施態様においては、前記ノード識別子が、子ノードよりも同じ世代のノードを優先して付与された連続する整数であり、前記ルート・ノード以外のノードである非ルート・ノードの各々に付与されたノード識別子に関連付けて、前記非ルート・ノードの各々の親ノードに付与されたノード識別子を格納した親子関係定義配列が、前記記憶装置中に記憶され、
前記新規ノード識別子配列を生成するステップにおいて、前記コンピュータに、
前記それぞれのノードに、子ノードより同じ世代のノードを優先して付与された連続する整数であるノード識別子を付与するステップを実行させる。【００４５】
他の好ましい実施態様においては、前記ノード識別子が、同じ世代のノードよりも子ノードを優先して付与された連続する整数であり、前記ルート・ノード以外のノードである非ルート・ノードの各々に付与されたノード識別子に関連付けて、前記非ルート・ノードの各々の親ノードに付与されたノード識別子を格納した親子関係定義配列が、前記記憶装置中に記憶され、
前記新規ノード識別子配列を生成するステップにおいて、前記コンピュータに、
前記それぞれのノードに、同じ世代のノードより子ノードを優先して付与された整数であるノード識別子を付与するステップを実行させる。【００４６】
また、好ましい実施態様においては、前記記憶装置に、前記ツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納したノード値格納配列が記憶され、前記コンピュータに、
前記新規ノード識別子配列を参照して、もとのノード識別子と新たなノード識別子との関連付けにしたがって、前記ノード値格納配列を更新するステップを実行させる。【００４７】
他の好ましい実施態様においては、前記記憶装置に、前記ツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納したノード値格納配列が記憶され、前記コンピュータに、
前記新規ノード識別子配列を参照して、もとのノード識別子と新たなノード識別子との関連付けにしたがって、新たなノード識別子の各々と関連付けて、前記ノード値を格納した、新たなノード値格納配列を生成するステップを実行させる。【００４８】
より好ましい実施態様においては、前記新規ノード識別子配列を生成するステップにおいて、前記コンピュータに、
前記親子関係定義配列と同一のサイズの新規ノード識別子配列のための領域を、前記記憶装置中に確保するステップと、
新たなノード識別子を一時的に記憶するカレントノード識別子領域を、前記記憶装置中に確保して、その初期値を格納するステップと、
前記消去フラグ配列を参照して、前記消去フラグ配列の値がセットされていない場合には、当該新規ノード識別子配列の値として、前記カレントノード識別子領域の値を格納し、その後、前記カレントノード識別子領域の値を増分し、その一方、消去フラグ配列の値がセットされている場合には、当該新規ノード識別子配列の値として無効値を格納するステップと、を実行させる。【００４９】
別の好ましい実施態様においては、前記部分ツリー削除後の親子関係定義配列を生成するステップにおいて、前記コンピュータに、
前記親子関係定義配列と同一サイズの格納アドレス配列のための領域を、前記記憶装置中に確保するステップと、
前記新規ノード識別子配列中、前記親子関係定義配列の値の格納位置と同じ位置の値を参照して、値が無効値である場合を除き、前記格納アドレス配列に、前記新規ノード識別子配列中の値を格納するステップと、
前記親子関係定義配列と同一サイズの親ノード識別子配列のための領域を、前記記憶装置中に確保するステップと、
前記新規ノード識別子配列中、前記親子関係定義配列の値が示す位置の値を参照して、前記親ノード識別子配列中、前記親子関係定義配列の値の位置と同じ位置に、前記新規ノード識別子配列の値を格納するステップと、
前記格納アドレス配列中の値に関連付けて、前記親ノード識別子配列の値を格納した親子関係定義配列を生成するステップと、を実行させる。【００５０】
さらに、本発明の目的は、ツリー型データ構造を表すために、ルート・ノードを含むノードに付与された固有のノード識別子であって、子ノードよりも同じ世代のノードを優先して付与された連続する整数であるノード識別子を用いて、前記ルート・ノード以外のノードである非ルート・ノードの各々に付与されたノード識別子に関連付けて、前記非ルート・ノードの各々の親ノードに付与されたノード識別子を格納した、記憶装置中に生成された親子関係定義配列を備えたコンピュータにおいて、
あるツリーを被挿入側ツリーとして、当該被挿入側ツリーの特定のノードに、他のツリーである挿入側ツリーのルート・ノードを連結することにより、当該挿入側ツリーを追加し、当該挿入後のツリーのツリー型データ構造について、前記記憶装置中に親子関係定義配列を生成するために、前記コンピュータにより読み出し可能な情報処理プログラムであって、前記コンピュータに、
被挿入側ツリーの第１の親子関係定義配列、および、挿入側ツリーの第２の親子関係定義配列を記憶装置から読み出すステップと、
前記挿入側ツリーのルート・ノードを、被挿入側ツリーの部分ツリー中、最もルート・ノードに近い位置にある頂点ノードとして、当該頂点ノードが挿入される位置の情報に基づいて、挿入側ツリーのそれぞれのノードに隣接する、被挿入側ツリーのノードを特定し、当該被挿入側ツリーのノードの情報を、前記記憶装置に記憶するステップと、
前記被挿入側ツリーのノードの情報を参照して、前記挿入側ツリーの挿入後の前記被挿入側ツリーについて、それぞれのノードに、子ノードよりも同じ世代のノードを優先して付与された連続する整数であるノード識別子を付与し、付与された新たなノード識別子を、挿入前の被挿入側ツリーのノードのノード識別子と関連付けて格納した第１の新規ノード識別子配列を、前記記憶装置に生成するとともに、前記挿入側ツリーの頂点ノードが挿入される位置の情報に基づいて、前記挿入側ツリーの挿入後の前記挿入側ツリーについて、それぞれのノードに、子ノードよりも同じ世代のノードを優先して付与された連続する整数であるノード識別子を付与し、付与された新たなノード識別子を、挿入前の挿入側ツリーのノードのノード識別子と関連付けて格納した第２の新規ノード識別子配列を、前記記憶装置に生成するステップと、
前記第１および第２の親子関係定義配列、および、前記第１および第２の新規ノード識別子配列に基づいて、前記新たなノード識別子に関連付けて、当該ノード識別子をもつノードの親ノードのノード識別子を格納した、挿入後のツリーの親子関係定義配列を、前記記憶装置に生成するステップと、
を実行させることを特徴とする情報処理プログラムにより達成される。【００５１】
好ましい実施態様においては、前記記憶装置に、前記被挿入側ツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納した第１のノード値格納配列が記憶され、前記挿入側ツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納した第２のノード値格納配列が記憶され、前記コンピュータに、
前記第１および第２の新規ノード識別子配列を参照して、被挿入側ツリーおよび挿入側ツリーのそれぞれのもとのノード識別子と、挿入後のツリーの新たなノード識別子との関連付けにしたがって、前記第１のノード値格納配列および第２のノード配列の少なくとも一方を更新するステップを実行させる。【００５２】
他の好ましい実施態様においては、前記記憶装置に、前記被挿入側ツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納した第１のノード値格納配列が記憶され、前記挿入側ツリーのノードのノード識別子の各々に関連付けて、当該ノードの少なくともノード値を格納した第２のノード値格納配列が記憶され、前記コンピュータに、
前記第１および第２の新規ノード識別子配列を参照して、被挿入側ツリーおよび挿入側ツリーのそれぞれのもとのノード識別子と、挿入後のツリーの新たなノード識別子との関連付けにしたがって、新たなノード識別子の各々と関連付けて、前記ノード値を格納した、新たなノード値格納配列を生成するステップを実行させる。【００５３】
より好ましい実施態様においては、前記被挿入側ツリーのノードの情報を、前記記憶装置に記憶するステップにおいて、前記コンピュータに、
前記挿入側ツリーの頂点ノードが挿入される位置の情報に基づいて、前記第１の親子関係定義配列と同一のサイズの挿入マーク配列中、前記挿入される位置の直後のノードおよび前記直後のノードを先祖とするノードについて、当該挿入位置であることを示す値を格納するステップを実行させる。【００５４】
別の好ましい実施態様においては、さらに、前記コンピュータに、前記被挿入側ツリーの各ノードの、当該被挿入側ツリーの頂点ノードからの深さのレベルを表すレベル値を格納した第１のレベル配列を、前記記憶装置に生成するステップと、
前記第１のレベル配列中、前記挿入側ツリーの頂点ノードの挿入位置に相当するレベル値を参照して、前記挿入側ツリーの各ノードの、前記被挿入側ツリーの頂点ノードからの深さのレベルを表すレベル値を格納した第２のレベル配列を、前記記憶装置に生成するステップと、を実行させ、
前記第１および第２の新規ノード識別子配列を生成するステップにおいて、前記コンピュータに、
前記第１および第２の親子関係定義配列と、それぞれ、同一のサイズの第１および第２の新規ノード識別子配列のための領域を、前記記憶装置中に確保するステップと、
新たなノード識別子を一時的に記憶するカレントノード識別子領域を、前記記憶装置中に確保して、その初期値を格納するステップと、を実行させ、
前記挿入マーク配列中、その値が、挿入位置であることを示す値に変化している位置以外の位置においては、前記コンピュータに、
（ａ）前記第１の新規ノード識別子配列中、当該位置の値として、前記カレントノード識別子領域の値を格納し、
（ｂ）その後、前記カレントノード識別子領域の値を増分する
ステップを、さらに実行させ、
前記挿入マーク配列中、当該挿入マーク配列の値が、挿入位置であることを示す値に変化する位置においては、前記コンピュータに、
（ａ）前記第１のレベル配列中、当該位置のレベル値を参照し、かつ、前記第２のレベル配列中、同一のレベル値を有する範囲を特定し、
（ｂ）前記第２の新規ノード識別子配列中、当該範囲の先頭位置から順次、カレントノード識別子領域の値を格納し、
（ｃ）その後、前記カレントノード識別子領域の値を増分し、
（ｄ）前記第２の新規ノード識別子配列中、前記同一のレベル値を有する範囲への値の格納が終了すると、第１の新規ノード識別子配列の値として、前記カレントノード識別子領域の値を格納し、
（ｅ）その後、前記カレントノード識別子領域の値を増分するステップを、さらに実行させる。【００５５】
また、別の好ましい実施態様においては、前記ツリー挿入後の親子関係定義配列を生成するステップにおいて、前記コンピュータに、
前記第１の親子関係定義配列と同一サイズの、第１の親ノード識別子配列のための領域を、前記記憶装置中に確保するステップと、
前記第１の新規ノード識別子配列中、前記第１の親子関係定義配列の値が示す位置の値を参照して、前記第１の親ノード識別子配列中、前記親子関係定義配列の値の位置と同じ位置に、前記第１の新規ノード識別子配列の値を格納するステップと、
前記第１の新規ノード識別子配列の値と、前記第１の親ノード識別子配列の値とを関連付けるステップと、
前記第２の親子関係定義配列と同一サイズの、第２の親ノード識別配列のための領域を、前記記憶装置中に確保するステップと、
前記第２の新規ノード識別子配列中、先頭の値として、前記挿入側ノードの頂点ノードの親ノードとなるノードのノード識別子を格納するともに、他の値として、前記第２の親子関係定義配列の値が示す位置の値を参照して、前記第２の親ノード識別子配列中、前記親子関係定義配列の値の位置と同じ位置に、前記第２の新規ノード識別子配列の値を格納するステップと、
前記第２の新規ノード識別子配列の値と、前記第２の親ノード識別子配列の値とを関連付けるステップと、
前記第１の新規ノード識別子配列の値および前記第２の新規ノード識別子配列の値のそれぞれに関連付けられた、前記第１の親ノード識別子配列の値および第２の親ノード識別子配列の値を、挿入後の親子関係定義配列に格納するステップと、を実行させる。
【発明の効果】
【００５６】
本発明によれば、効率的にツリーから、当該ツリーの一部分である部分ツリーを削除し、また、あるツリーに他のツリーを挿入する方法、情報処理装置、および、プログラムを提供することが可能となる。
【発明を実施するための最良の形態】
【００５７】
以下、添付図面を参照して、本発明の実施の形態につき説明を加える。【００５８】
［コンピュータシステム構成］
図１は、本発明の実施の形態にかかるツリー型データ構造を取り扱う情報処理装置のハードウェア構成を示すブロックダイヤグラムである。図１に示すように、この情報処理装置１０は、通常のコンピュータと同様の構成であり、プログラムを実行することにより装置全体および個々の構成部分を制御するＣＰＵ１２、ワークデータなどを記憶するＲＡＭ(Random Access Memory)１４、プログラム等を記憶するＲＯＭ(Read Only Memory)１６、ハードディスク装置１８、ＣＤ−ＲＯＭ１９をアクセスするためのドライバ２０、ドライバ２０や外部ネットワーク（図示せず）と接続された外部端子との間に設けられたインタフェース（Ｉ／Ｆ）２２、キーボードやマウスからなる入力装置２４、表示装置２６を備えている。ＣＰＵ１２、ＲＡＭ１４、ＲＯＭ１６、ハードディスク装置１８、Ｉ／Ｆ２２、入力装置２４および表示装置２６は、バス２８を介して相互に接続されている。上記実施の形態では、コンピュータシステム１０は、ドライバ２０により、ＣＤ−ＲＯＭ１９に格納されたデータを読み出すように構成されているが、これに限定されるものではなく、ＣＤ−Ｒ／Ｗ、ＤＶＤ−ＲＯＭ，ＤＶＤ−ＲＡＭなどに格納されたデータを読み出し可能に構成しても良い。【００５９】
本実施の形態にかかる、ツリー型データ構造をＲＡＭ１４などメモリ上に構築するプログラム、及び、ツリー型データ構造をメモリ上で変換するプログラムは、ＣＤ−ＲＯＭ１９に収容され、ドライバ２０に読取られても良いし、ＲＯＭ１６に予め記憶されていても良い。また、いったんＣＤ−ＲＯＭ１９から読み出したものを、ハードディスク装置１８の所定の領域に記憶しておいても良い。或いは、上記プログラムは、ネットワーク（図示せず）、外部端子およびＩ／Ｆ２２を経て外部から供給されるものであっても良い。【００６０】
また、本発明の実施の形態にかかる情報処理装置は、コンピュータに、ツリー型データ構造をメモリ上に構築するプログラム、および、ツリー型データ構造をメモリ上で変換するプログラムを実行させることにより実現される。このツリー型データ構造をメモリ上で変換するプログラムに、後述するツリー挿入処理を実現するプログラムやツリー削除処理を実現するプログラムも含まれる。【００６１】
［ツリー型データ構造］
図２Ａ、Ｂは、ツリー型データの一例であるＰＯＳデータの説明図であり、図２Ａは、このツリー型データのデータ構造（即ち、トポロジー）及びデータ値を視覚的に表現した一例であり、図２Ｂは、同じツリー型データをＸＭＬ形式で表現した一例である。図２Ａ、Ｂに示されるようにツリー型データ構造は、ルート・ノード（本例では、ＰＯＳデータ）から始めて、各ノードで枝分かれしてリーフ・ノード（端点）に至るノードとアークの組み合わせによって表現される。各ノードには、項目名情報、すなわち、ノードのタイプと、項目値情報、すなわち、ノードの値が関連付けられ、図２Ｂの例では、ＸＭＬ形式の
<shopName>フランス店</shopName>
に対応したノードは、「shopName（＝店名）」というノードタイプと「フランス店」というノード値が関連付けられている。この関連付けは、例えば、ノードタイプ及びノード値を記述する情報が格納されたノード情報格納領域へのポインタを、ノード識別子に随伴させることによって実現することができる。しかし、本発明は、ツリー型データ構造の実体的な値の取り扱い方によって限定されないことに注意する必要がある。【００６２】
これに対して、ツリー型データ構造のデータの検索、集計、ソートを効率的に実行するためには、ツリー型データ構造のトポロジーを表現する手法、すなわち、記憶装置に展開する手法が非常に重要な役割を果たす。そこで、以下では、主として、ツリー型データ構造のトポロジーに関して説明する。【００６３】
従来、このようなツリー型データ構造は、データを蓄えたノード間をポインタで接続することによって表現されている。しかし、ポインタ表現は、ポインタ値に必然性がないという欠点がある。即ち、ある場合には特定のノードＡがある番地（例えば、１００番地）に格納され、別の場合には同じノードＡが別の番地（例えば、２００番地）に格納されるので、ポインタ値が一定ではなく、ポインタ値は、本質的にノードの格納アドレスを表現するに過ぎない。そのため、例えば、ノードが深さ優先の規則に従ってポインタで接続されている場合、これらのノードを幅優先の規則に従ってポインタで再接続することは困難である。【００６４】
これに対して、本発明者は、ツリー型データ構造のトポロジーがアークリストによって記述可能であることに着目した。アークリストとは、ノード間の親子関係を表すアークのリストである。図３Ａ〜Ｃは、アークリストを用いたツリー型データ構造の表現形式の一例の説明図である。同図の例では、「０」、「１０」、「２０」、「３０」、「４０」、「５０」、「６０」、「７０」、「８０」、「９０」、「１００」及び「１１０」のノード識別子（ＩＤ）が付与された１２個のノードからなるツリー型データ構造が示されている。図３Ａはツリー型データ構造の全体を示している。図３Ａにおいて、（ノードのタイプを表している）丸形、ハート形などの図形の中央に記載された数字は、ノードＩＤを表し、矢印と矢印の側に記載された＜０，１０＞などの数字の対は、アークを表している。尚、ノードＩＤは、文字列には限られず、数値、特に、整数でもよい。図３Ｂは、親ノード（Ｆｒｏｍ−ＩＤ）から子ノード（Ｔｏ−ＩＤ）へのアークリストを示し、図３Ｃは、ノードＩＤとノードＴｙｐｅの対のリストからなるノードリストを示す。尚、ツリー型データ構造を表現するだけの目的のためにはノードリストが無くても構わない。原理的には、このようなアークリストを用いることによって、ノード間の関係をポインタによらずに直接的に記述することが可能である。【００６５】
［「子→親」関係に基づく表現］
図３Ａ〜Ｃの例では、アークリストは、親ノードに子ノードを対応付ける「親→子」関係に基づいて記述されている。そのため、一つの親ノード、例えば、ルート・ノード０には、３個の子ノード１０、６０及び８０が存在するため、アークリストのＦｒｏｍ−ＩＤには、同じノードＩＤの「０」が３回出現している。つまり、親ノードを特定しても子ノードを特定することができないので、アークリストは、要素Ｆｒｏｍ−ＩＤの配列と要素Ｔｏ−ＩＤの配列により構成される。アークリストを使用する場合、あるノードは、Ｆｒｏｍ−ＩＤの配列と、Ｔｏ−ＩＤの配列の両方の配列に出現する。【００６６】
これに対して、親子関係は、「子→親」関係によっても表現することが可能である。この場合、ノード間の親子関係は、ルート・ノード以外のノードである非ルート・ノードの各々と、関連付けられた親ノードと、の組の配列によって表現される。この「子→親」関係によって親子関係を表現する場合、「親→子」関係の場合には得られなかった重要な性質がある。即ち、一つの子ノードには必ず唯一の親ノードが対応するので、子ノードを特定することによって、この子ノードに対応する唯一の親ノードを直ちに特定することができる。つまり、アークリストは、実際には、要素Ｔｏ−ＩＤの配列だけを準備すればよい。この結果として、アークリストを格納するための記憶容量が削減される。この記憶容量の削減は、メモリへのアクセス回数が低減するという効果があるので、結果的に、処理の高速化が実現できる。【００６７】
図４Ａ〜Ｃは、本発明の一実施例による「子→親」関係に基づくツリー型データ構造の表現方法の説明図である。図４Ａはツリー全体の説明図であり、図４Ｂは「子→親」関係に基づくアークリストである。図４Ｂのアークリストは、ルート・ノードに対する親ノードの格納領域を含んでいるので、ルート・ノードの親ノードとして、便宜的に"−"が設定されている。但し、ルート・ノードに対応する親ノードは存在しないので、図４Ｃに示されるように、「子→親」関係に基づくアークリストからルート・ノードに対する親ノードの格納領域を除いても構わない。このように本発明の一実施例では、ルート・ノード以外のノードである非ルート・ノードの各々に対して、非ルート・ノードの親ノードを関連付けることによりノード間の親子関係を表現する。そして、「子→親」表現された子のノードから親のノードのリストを辿ることでツリーのトポロジーを表現することができる。【００６８】
このような「子→親」関係に基づくツリー型データ構造は、本発明の一実施例によれば、図５に示されるように、図１に示されたコンピュータシステム１０に、ルート・ノードを含むノードに固有のノード識別子を付与するノード定義ステップ５０１と、前記ルート・ノード以外のノードである非ルート・ノードの各々に付与されたノード識別子に、前記非ルート・ノードの各々の親ノードに付与されたノード識別子を関連付ける親子関係定義ステップ５０２と、を実行させることによってＲＡＭ１４上に構築される。このように、最初に、文字列、浮動小数、整数などの任意の識別情報によってノードにノード識別子を付与し、次に、「子→親」表現に基づいて親子関係を定義することによって、子ノードのノード識別子から親ノードのノード識別子を引く（ルックアップする）ことでツリーのトポロジーを表現することができる。【００６９】
［ノード識別子］
好ましい一実施例によれば、ノード定義ステップはノード識別子として数値を使用し、より好ましくは、連続する整数を使用し、更に好ましくは、「０」又は「１」からの整数連番を使用する。これにより、ノード識別子から、そのノードに対応する親ノードのノード識別子が格納されているアドレスを簡単に取得することができるので、子ノードのノード識別子から親ノードのノード識別子を引く処理を高速化することができる。【００７０】
ツリー型データ構造のノードにノード識別子として順序付きの番号を付与してノード間の親子関係を表現する場合、番号の付与順序に規則を定めることによって、その後のツリー型データ構造の取り扱いが容易になるという利点がある。本発明によれば、この番号の付与順序の規則として、同じ世代のノードよりも子ノードを優先する深さ優先モードと、子ノードよりも同じ世代のノードを優先する幅優先モードが利用される。【００７１】
図６Ａ〜Ｃは、本発明の一実施例によりＩＤ形式のツリー構造型データを整数連番形式のツリー構造型データへ変換する処理の説明図である。図６Ａには、各ノードにＩＤ番号が付与されたツリー構造型データが示され、図６Ｂには、変換規則が示され、図６Ｃには、各ノードに整数連番が付与されたツリー構造型データが示されている。本例の変換規則は、深さ優先で連続番号を付与する規則であり、具体的には、複数の子ノードが存在する場合、長子（一番上の兄）ノードに最小番号を付与し、末子（一番下の弟）ノードに大きい番号を付与し、かつ、兄弟ノードよりも子ノードを優先して番号を付与する。本例では、昇順に番号付けをしているが、降順に番号付けをしてもよい。【００７２】
また、図７Ａ〜Ｃは、本発明の他の一実施例によりＩＤ形式のツリー構造型データを整数連番形式のツリー構造型データへ変換する処理の説明図である。図７Ａには、各ノードにＩＤ番号が付与されたツリー構造型データが示され、図７Ｂには、変換規則が示され、図７Ｃには、各ノードに整数連番が付与されたツリー構造型データが示されている。本例の変換規則は、幅優先で連続番号を付与する規則であり、具体的には、複数の子ノードが存在する場合、長子（一番上の兄）ノードに最小番号を付与し、末子（一番下の弟）ノードに大きい番号を付与し、かつ、子ノードよりも兄弟ノードを優先して番号を付与する。本例では、昇順に番号付けをしているが、降順に番号付けをしてもよい。【００７３】
このようにノード識別子として番号を使用すると、ノード番号から直ちに、即ち、Ｏ（１）のオーダーで、そのノードに関する格納値が格納されているアドレスを引くことができる。また、親子関係を「子→親」表現することによって、子ノードから親ノードを直ちに、即ち、Ｏ（１）のオーダーで引くことができる。【００７４】
［深さ優先モード］
本発明の一実施例によれば、図６Ｃに示されるような深さ優先に基づくツリー型データ構造は、図１に示されたコンピュータシステム１０に、
同じ世代のノードよりも子ノードを優先して、ルート・ノードを含むノードに固有の連続する整数を付与するノード定義ステップと、
ルート・ノード以外のノードである非ルート・ノードの各々に付与された整数の順に、非ルート・ノードの各々の親ノードに付与された整数を並べることにより形成される配列を前記記憶装置に格納する親子関係定義ステップと、
を実行させることによって、記憶装置上に構築される。これにより、ノードは深さ優先で連続整数が付与され、ノード間の親子関係は「子→親」関係の配列によって表現される。【００７５】
図８は、本発明の一実施例による深さ優先に基づくノード定義処理のフローチャートである。このノード定義処理は、コンピュータシステム１０に
最初にルート・ノードに番号を付与するステップ８０１と、
既に番号が付与されたあるノードに唯一の子ノードが存在する場合には、当該子ノードに当該あるノードに付与された前記番号の次の番号を付与するステップ８０２と、
既に番号が付与されたあるノードに複数の子ノードが存在する場合には、当該複数の子ノードの間の兄弟関係に従って、弟ノードは直上の兄ノードの全ての子孫ノードに番号が付与された後に次の番号が付与されるように、一番上の兄ノードから一番下の弟ノードまで番号を付与するステップ８０３と、
を実行させる。これにより、深さ優先モードで同一の親ノードから派生した複数の子ノードの間に兄弟関係が定義される。【００７６】
図９は、本発明の一実施例により図６Ｃに示された深さ優先のツリー型データ構造から作成された「子→親」表現に基づく親子関係の配列の説明図である。図９にサブツリー１又はサブツリー２として示されているように、深さ優先で連続番号が付与されたノードの親子関係を「子→親」関係に基づいて配列表現すると、あるノードの子孫ノードが連続領域に出現するという優れた性質が得られる。【００７７】
本発明の一実施例では、深さ優先モードの優れた性質を利用することにより、前記配列から、あるノードに付与された整数以上の値が格納されている連続領域を抽出することにより、前記あるノードの全ての子孫ノードを特定する。これにより、あるノードの子孫ノードを表すノード群が前記配列内の連続ブロックとして獲得できる。例えば、連続ブロックのサイズを「ｍ」とすると、あるノードの全ての子孫ノードを特定するための処理速度は、Ｏ（ｍ）のオーダーになる。【００７８】
既に説明したように、ノード間の親子関係は、「子→親」関係の配列の他に、「親→子」関係の配列によっても表現できる。図１０は、図６Ｃに示された深さ優先のツリー型データ構造から作成された「親→子」表現に基づく親子関係の配列の説明図である。一つの親ノードに対して複数の子ノードが存在し得るので、親子関係の配列は、各ノードに対する子ノードの番号が格納されている領域を示すための配列Ａｇｇｒと、子ノードの番号が格納されている配列Ｐ→Ｃの二つの配列により構成される。例えば、配列Ａｇｇｒの先頭から２番目の要素Ａｇｇｒ［１］の値は”３”であり、これは、ノード［１］に対する子ノードの番号は、配列Ｐ→Ｃの要素Ｐ→Ｃ［３］以降に格納されていることを表している。これにより、ノード［０］、即ち、ルート・ノードに対する子ノードは、配列Ｐ→Ｃの先頭から３個の要素、Ｐ→Ｃ［０］の「１」、Ｐ→Ｃ［１］の「６」、及びＰ→Ｃ［２］の「８」であることがわかる。【００７９】
この「親→子」表現に基づく親子関係の配列の求め方を説明する。
（１）ノードの番号が配列Ｐ→Ｃの最大の添字（＝１１）と一致する場合、このノードに属する子ノードは存在しない。したがって、処理は継続されない。
（２）同図に太字で表された親ノードの番号からＡｇｇｒ値を求める。このＡｇｇｒ値は、配列Ｐ→Ｃの開始点を表す。
（３）太字で表された親ノード番号＋１に対応するＡｇｇｒ値を求める。このＡｇｇｒ値−１が配列Ｐ→Ｃの終了点である。【００８０】
例えば、ノード０の子ノードの開始点は、Ａｇｇｒ［０］、即ち、「０」であり、終了点は、Ａｇｇｒ［１］−１、即ち、「３−１＝２」である。したがって、ノード０の子ノードは、配列Ｐ→Ｃの０〜２番目の要素、即ち、「１」、「６」及び「８」である。【００８１】
或いは、「親→子」表現に基づく親子関係は、より単純に、親ノード番号の配列と、対応する子ノード番号の配列と、の二つの配列により表現することも可能である。しかし、この配列を利用して親子関係を見つけるためには、親ノードの番号を検索しなければならないので、即ち、ｌｏｇ（ｎ）のアクセス時間を要するので効率が悪い。【００８２】
［幅優先モード］
本発明の一実施例によれば、図７Ｃに示されるような幅優先に基づくツリー型データ構造は、図１に示されたコンピュータシステム１０に、
子ノードよりも同じ世代のノードを優先して、ルート・ノードを含むノードに固有の連続する整数を付与するノード定義ステップと、
前記ルート・ノード以外のノードである非ルート・ノードの各々に付与された整数の順に、前記非ルート・ノードの各々の親ノードに付与された整数を並べることにより形成される配列を前記記憶装置に格納する親子関係定義ステップと、
を実行させることによって、記憶装置上に構築される。これにより、ノードは幅優先モードで連続整数が付与され、ノード間の親子関係は「子→親」関係の配列によって表現される。【００８３】
図１１は、本発明の一実施例による幅優先に基づくノート定義処理のフローチャートである。このノード定義処理は、コンピュータシステム１０に、
各ノードが前記ルート・ノードから何世代目のノードであるか、及び、各世代に含まれるノード数を算出するステップ１１０１と、
最初に前記ルート・ノードに番号を付与するステップ１１０２と、
ある世代に含まれる全てのノードに番号が付与されたならば、当該ある世代の次の世代にノードが存在しなくなるまで、当該次の世代に含まれる全てのノードに対して、親ノードが異なる場合には、当該親ノードに番号が付与された順番に当該ノードに番号を付与し、当該親ノードが同一である場合には、当該親ノードから派生した複数の子ノードの間に兄弟関係を定義し、一番上の兄ノードから一番下の弟ノードまで直前に付与された番号の次の番号から連続的に変化する固有の整数を順に付与するステップ１０１３と、
を実行させる。これにより、幅優先モードで同一の親ノードから派生した複数の子ノードの間に兄弟関係が定義される。【００８４】
図１２は、本発明の一実施例により図７Ｃに示された幅優先のツリー型データ構造から作成された「子→親」表現に基づく親子関係の配列の説明図である。図１２に示されているように、幅優先で連続番号が付与されたノードの親子関係を「子→親」関係に基づいて配列表現すると、あるノードの子ノードは連続領域に出現するという優れた性質が得られる。これは、幅優先モードで連続番号が付与されたノードの親子関係を「子→親」関係に基づいて配列表現すると、親ノードに付与された番号が前記配列中に順序付き（昇順又は降順）で出現することによる。【００８５】
したがって、本発明の一実施例では、幅優先モードの優れた性質を利用することにより、前記配列から、あるノードに付与された整数と同じ値が格納されている連続領域を抽出することにより、前記あるノードの全ての子ノードを特定する。これにより、あるノードの子ノードを、例えば、二分探索などの手法を用いて検索することが可能であり、即ち、Ｏ（ｌｏｇ（ｎ））のオーダーで検索することが可能になる。【００８６】
既に説明したように、ノード間の親子関係は、「子→親」関係の配列の他に、「親→子」関係の配列によっても表現できる。図１３は、図７Ｃに示された幅優先のツリー型データ構造から作成された「親→子」表現に基づく親子関係の配列の説明図である。図１３に示されるように、一つの親ノードに対して複数の子ノードが存在し得るので、親子関係の配列は、各ノードに対する子ノードの番号が格納されている領域を示すための配列Ａｇｇｒと、子ノードの番号が格納されている配列Ｐ→Ｃの二つの配列により構成される。例えば、配列Ａｇｇｒの先頭から２番目の要素Ａｇｇｒ［１］の値は「３」であり、これは、ノード［１］に対する子ノードの番号は、配列Ｐ→Ｃの要素Ｐ→Ｃ［３］以降に格納されていることを表している。これにより、ノード［０］、即ち、ルート・ノードに対する子ノードは、配列Ｐ→Ｃの先頭から３個の要素、Ｐ→Ｃ［０］の「１」、Ｐ→Ｃ［１］の「２」、及び、Ｐ→Ｃ［２］の「３」であることがわかる。【００８７】
この「親→子」表現に基づく親子関係の配列の求め方を説明する。
（１）ノードの番号が配列Ｐ→Ｃの最大の添字（＝１１）と一致する場合、このノードに属する子ノードは存在しない。したがって、処理は継続されない。
（２）同図に太字で表された親ノードの番号からＡｇｇｒ値を求める。このＡｇｇｒ値は、配列Ｐ→Ｃの開始点を表す。
（３）太字で表された「親ノード番号＋１」に対応するＡｇｇｒ値を求める。この「Ａｇｇｒ値−１」が配列Ｐ→Ｃの終了点である。【００８８】
例えば、ノード０の子ノードの開始点は、Ａｇｇｒ［０］、即ち、「０」であり、終了点は、Ａｇｇｒ［１］−１、即ち、「３−１＝２」である。したがって、ノード０の子ノードは、配列Ｐ→Ｃの０〜２番目の要素、即ち、「１」、「２」及び「３」である。【００８９】
［ツリー型データ構造の表現形式の相互変換］
上述のように、ノードに連続番号を付与するための深さ優先モード及び幅優先モードは、それぞれ、固有の優れた性質を備えている。本発明の一実施例による情報処理装置１０は、詳細な説明は省略するが、図１４に示すように、深さ優先に基づく「子→親」表現形式と、幅優先に基づく「子→親」表現形式と、「親→子」表現形式と、の間で相互に表現形式を変換することができる。【００９０】
［ツリー削除］
次に、ツリー型データ構造のトポロジーを編集する操作の一つであるツリー削除について説明する。本発明にかかる「ツリー削除」は、ツリー型データ構造において、全体のツリーから、ある特定のノードおよびそのノードの子孫ノード（つまり、部分ツリー）を取り除くことを意味する。実際には、ツリー型データ構造を表す、メモリ中に格納されている「子→親」表現による親子関係定義配列（以下、「Ｃ−Ｐ配列」と称する。また、図においては、「C->P」、或いは、「C-P」と表記される。）から、部分ツリーに相当するノードの情報が削除され、かつ、残りのノードに対して、たとえば幅優先モードにしたがって付された新たなノード識別子を格納したＣ−Ｐ配列をメモリ中に生成することである。なお、全体のツリーから削除される部分ツリーには、単一のノードから構成されるものも含まれる。また、本明細書において、上記ツリー型データ構造において、あるノードおよびそのノードから枝分かれしてリーフ・ノードに至るまでのノード群を、部分ツリーと称する。また、部分ツリーにおいて、ルート・ノードに最も近いノードを頂点ノードと称する。【００９１】
以下、本実施の形態において、幅優先モードで、ツリー型データ構造が表され、幅優先モードにしたがって、ツリーを構成するノードのノード識別子を格納したＣ−Ｐ配列がメモリに記憶されている場合のツリー削除について説明する。【００９２】
図１５は、本実施の形態にかかる幅優先モードで表されたツリー型データ構造の一例を視覚的に表した図である。このツリー型データ構造において、ノード識別子「２」のノード（符号１５０１参照）を頂点ノードとする部分ツリーを削除することを考える。ツリー削除の処理においては、基本的には、ノード識別子「２」を頂点ノードとする部分ツリーが、全体のツリーから除かれた状態で、幅優先モードにしたがって、残りのノードに、新たにノード識別子が付与され、そのノード識別子に関する配列がメモリなどに記憶される。【００９３】
図１６は、本実施の形態にかかるツリー削除処理を示すフローチャートである。図１６に示すように、ＣＰＵ１２は、デリートフラグ配列、新規ノード識別子配列およびカレントノード番号領域を、ＲＡＭ１４などのメモリ中に確保する（ステップ１６０１）。次いで、ＣＰＵ１２は、削除対象となる部分ツリーの頂点ノードのノード識別子について、デリートフラグ配列のフラグをセットする（ステップ１６０２）。なお、削除対象は、オペレータが、たとえば、表示装置２６に表示された、図１５のようなツリー型データ構造のトポロジーを参照して、入力装置２４を操作して、頂点ノードを指定すればよい（本例では、ノード１５０１）。【００９４】
図１７は、図１５に示すツリー型データ構造の親子関係を表す配列、初期値が格納されたデリートフラグ配列（図中、「Ｄｅｌｅｔｅ  Ｆｌａｇ」と表記される。）、新規ノード識別子配列（図中、「Ｎｅｗ  Ｎｏｄｅ  Ｎｏ．」と表記される。）、および、初期値が配置されたカレントノード識別子領域（図中、「Ｃｕｒｒｅｎｔ  Ｎｏｄｅ  Ｎｏ．」と表記される。）を示す図である。【００９５】
この例では、ノード識別子「２」のノードを頂点ノードとする部分ツリーが削除されるため、図１７に示すように、デリートフラグ配列１７０１において、ノード識別子「２」に関する要素が「１」にセットされる（すなわち、フラグがセットされる）。また、カレントノード識別子領域１７０２には、初期値「０」が格納される。【００９６】
ＣＰＵ１２は、処理対象とするノードを特定するための処理対象位置を「０」に初期化する（ステップ１６０３）。ＣＰＵ１２は、デリートフラグ配列中、処理対象位置のフラグをチェックし（ステップ１６０４）、フラグがセットされているか否かを判断する（ステップ１６０５）。ステップ１６０５でノー(No)の場合に、次いで、ＣＰＵ１２は、デリートフラグ配列中、処理対象位置のノードの親ノードについて、そのフラグをチェックし（ステップ１６０６）、フラグがセットされているかを判断する（ステップ１６０７）。ステップ１６０７においてもノー(No)と判断された場合には、ＣＰＵ１２は、カレントノード識別子領域の値を、新規ノード識別子配列中、処理対象位置に格納し、かつ、カレントノード識別子領域の値をインクリメントする（ステップ１６０８）。【００９７】
その一方、ステップ１６０５でイエス(Yes)或いはステップ１６０７でイエス(Yes)と判断された場合には、ＣＰＵ１２は、デリートフラグ配列中、処理対象位置の要素を「１」にセットし、かつ、新規ノード識別子配列中、処理対象位置に、「−１」を格納する（ステップ１６０９）。【００９８】
あるノード識別子を有するノードが、削除対象の部分ツリーに属する場合には、ステップ１６０５或いはステップ１６０７でイエス(Yes)と判断される。その場合には、デリートフラグ配列の対応する要素に「１」がセットされ、そのノードが削除対象であることを明らかにする。また、新規ノード識別子配列において、当該ノードが削除対象であることがわかるように、特定の値「−１」を与える。【００９９】
その一方、あるノード識別子を有するノードが、削除対象の部分ツリーに属しない場合には、そのノードについて、削除対象の部分ツリーを構成する１以上のノードを除いた新たなノード識別子が付与される。新規ノード識別子配列に、新たなノード識別子が格納される。【０１００】
図１８Ａ、Ｂ、図１９Ａ、Ｂおよび図２０を参照して、図１５に示す例において、ノード識別子「２」を有する頂点ノードを含む部分ツリーの削除処理についいて説明する。【０１０１】
図１８Ａに示すように、処理対象位置「０」のときには、ステップ１６０５およびステップ１６０７でノー（No）と判断される。その結果、カレントノード識別子領域の値「０」が、新規ノード識別子配列中、処理対象位置「０」に格納され、その後、カレントノード識別子領域の値がインクリメントされて「１」となる。図１８Ｂに示すように、処理対象位置「１」のときにも、ステップ１６０５およびステップ１６０７でノー（No）と判断される。その結果、カレントノード識別子領域の値「１」が、新規ノード識別子配列中、処理対象位置「１」に格納され、その後、カレントノード識別子領域の値がインクリメントされて「２」となる。【０１０２】
図１９Ａに示すように、処理対象位置「２」のときには、ステップ１６０５でイエス(Yes)と判断される。その結果、デリートフラグ配列中、処理対象位置「２」の値が、（実際には既にセットされているが）「１」にセットされ、かつ、新規ノード識別子配列中、処理対象位置「２」の値として「−１」が格納される。図１９Ｂに示すように、処理対象位置「６」のときには、ステップ１６０７でイエス(Yes)と判断される。その結果、デリートフラグ配列中、処理対象位置「６」の値が、「１」にセットされ、かつ、新規ノード識別子配列中、処理対象位置「６」の値として「−１」が格納される。【０１０３】
全てのノード（つまり、ノード識別子「０」〜「１１」までのノード）について、図１６に示す処理が実行されると（図１６のステップ１６１０、１６１１参照）、図２０に示すような配列を得ることができる。ＣＰＵ１２は、新規ノード識別子配列に基づいて、部分ツリーを構成するノードの削除後のツリーのＣ−Ｐ配列を生成する。【０１０４】
図２１は、ツリー削除後のＣ−Ｐ配列の生成のための処理（ツリー削除処理（２））を示すフローチャートである。図２１に示すように、ＣＰＵ１２は、新たなＣ−Ｐ配列の領域をメモリ中に確保する（ステップ２１０１）。なお、新たなＣ−Ｐ配列のための領域のサイズは、ツリー削除の前のＣ−Ｐ配列のサイズより小さくなるため、ツリー削除の前のＣ−Ｐ配列のサイズと同じであれば十分である。次いで、ＣＰＵ１２は、新たなＣ−Ｐ配列の格納アドレス（つまり、格納位置番号）を一時的に格納するための格納アドレス配列の領域、および、ツリー削除後の各ノードの親ノードのノード識別子を一時的に格納するための親ノード識別子配列の領域を、メモリ中に確保する（ステップ２１０２）。これら配列のサイズは、Ｃ−Ｐ配列のサイズと同じであれば良い。【０１０５】
ＣＰＵ１２は、処理対象位置を「０」に初期化する（ステップ２１０３）。ＣＰＵ１２は、処理対象となるノードの各々について、格納アドレスの算出および親ノードのノード識別子の算出を実行する。格納アドレスの算出において、ＣＰＵ１２は、新規ノード識別子配列中、処理対象位置の値を取得する（ステップ２１０４）。次いで、ＣＰＵ１２は、格納アドレス配列中、処理対象位置に、ステップ２１０４にて取得した値を格納する（ステップ２１０５）。なお、新規ノード識別子配列中の値が「−１」であるときには、格納アドレス配列には、無効値を格納する。【０１０６】
図２２Ａ〜Ｄは、ステップ２１０４およびステップ２１０５にて実行される処理を具体的に説明する図である。たとえば、図２２Ａに示すように、処理対象位置「０」のときには、新規ノード識別子配列中、格納位置番号「０」の値「０」が取得され、取得された値「０」が、格納アドレス配列（図中、「Ａｄｄｒ」と表記する）中、格納位置番号「０」の位置に格納される。また、図２２Ｂに示すように、処理対象位置「１」のときには、新規ノード識別子配列中、格納位置番号「１」の値「１」が取得され、取得された値「１」が、格納アドレス配列中、格納位置番号「１」の位置に格納される。【０１０７】
その一方、図２２Ｃに示すように、処理対象位置「２」のときには、新規ノード識別子配列中、格納位置番号「２」の値が取得されるが、この値は「−１」である。したがって、格納アドレス配列中、格納位置番号「２」の位置には、無効値が格納される。このような処理が繰り返され、図２２Ｄに示すように、値が格納された格納アドレス配列を得ることができる。【０１０８】
親ノードのノード識別子の算出においては、ＣＰＵ１２は、Ｃ−Ｐ配列中、処理対象位置の値（ノード識別子）を取得し（ステップ２１０６）、新規ノード識別子配列中、Ｃ−Ｐ配列の値（ノード識別子）が示す位置の値を取得する（ステップ２１０７）。さらに、ＣＰＵ１２は、親ノード識別子配列中、処理対象位置に、取得した新規ノード識別子配列の値を格納する（ステップ２１０８）。なお、図２１には示していないが、Ｃ−Ｐ配列の値（ノード識別子）が「−１」である場合には、例外的に、親ノード識別子配列中、同じ処理対象位置に、その値「−１」を格納する。これはルート・ノードに対する例外処理である。【０１０９】
図２３Ａ〜Ｄは、ステップ２１０６〜２１０８にて実行される処理を具体的に説明する図である。たとえば、図２３Ａに示すように、処理対象位置「０」のときには、Ｃ−Ｐ配列の値が「−１」であるため、例外処理として、親ノード識別子配列（図中、「Ｐ−Ｎｏｄｅ」と表記する）中、格納位置番号「０」の値として「−１」が格納される。図２３Ｂに示すように、処理対象位置「１」のときには、Ｃ−Ｐ配列の値が「０」であるため、新規ノード識別子配列中、格納位置番号「０」の値「０」が取得され、この取得された値「０」が、親ノード識別子配列中、処理対象位置「１」（格納位置番号「１」の位置）に格納される。同様に、図２３Ｃに示すように、処理対象位置「２」のときには、Ｃ−Ｐ配列の値が「０」であるため、新規ノード識別子配列中、格納位置番号「０」の値「０」が取得され、この取得された値「０」が、親ノード識別子配列中、処理対象位置「２」（格納位置番号「２」の位置）に格納される。なお、処理対象位置「２」の親ノード識別子配列の値は、後述するように格納アドレスが無効値であるから最終的には利用されない。このような処理が繰り返され、図２３Ｄに示すように、値が格納された親ノード識別子配列を得ることができる。【０１１０】
全てのノード識別子について、格納アドレスの算出（ステップ２１０４、２１０５）、および、親ノードのノード識別子の算出（ステップ２１０６〜２１０８）が実行される（ステップ２１０９、２１１０参照）。その後、ＣＰＵ１２は、新たなＣ−Ｐ配列について、ある格納位置番号が示す位置の、格納アドレス配列の値が示す位置に、親ノード識別配列中、同じ格納位置番号が示す位置の値（ノード識別子）を格納する（ステップ２１１１）。ステップ２１１１の処理も、実際には、処理対象位置を初期化して、それぞれの処理対象位置について、格納アドレスおよび親ノード識別子を取得して、新たなＣ−Ｐ配列に、親ノード識別子を格納していけばよい。なお、格納アドレス配列の値が無効値であれば、新たなＣ−Ｐ配列への値の格納は省略される。【０１１１】
図２４ＡおよびＢは、それぞれ、図２２Ａ〜Ｄの処理で得られた格納アドレス配列、および、図２３Ａ〜Ｄの処理で得られた親ノード識別子配列の例である。たとえば、格納アドレス配列中、格納位置番号「０」の値は「０」であるから、新たなＣ−Ｐ配列中、格納アドレス配列の値「０」が示す位置に、親ノード識別子配列中、同じ格納位置番号である「０」の位置の値「−１」が格納される。同様に、格納アドレス配列中、格納位置番号「１」の値は「１」であるから、新たなＣ−Ｐ配列中、格納アドレス配列の値「１」が示す位置に、親ノード配列中、同じ格納位置番号である「１」の位置の値「０」が格納される。格納位置番号「２」のときには、格納アドレス配列の値が無効値であるから、新たなＣ−Ｐ配列への値の格納は省略される。このような処理を繰り返すことにより、図２４Ｃに示すような新たなＣ−Ｐ配列を得ることができる。【０１１２】
上述したように、ステップ２１１１の処理は、格納アドレス配列と親ノード識別子配列を、格納アドレス配列中の無効値を省略して合成することにより、新たなＣ−Ｐ配列を得ることに相当する。【０１１３】
図２５Ａは、図１５と同じツリー型データ構造の例を視覚的に表した図であり、このツリーから、ノード識別子「２」のノードを頂点ノードとする部分ツリーが削除されることを示している。図２４Ｃに示すＣ−Ｐ配列に基づいて、ツリー型データ構造を視覚的に表すと、図２５Ｂに示すようになる。図２５Ｂを参照すると、ノード識別子「２」のノードおよびその子孫ノードであるノード識別子「６」のノードが削除された状態であり、本実施の形態にかかるツリー削除が完了したことが示されている。【０１１４】
［ツリー挿入］
次に、ツリー型データ構造のトポロジーを編集する操作であるツリー挿入について説明する。本発明にかかる「ツリー挿入」は、ツリーの特定ノードに、あるノードをルート・ノードとする他のツリーを追加すること（つまり、ルート・ノードを頂点ノードとして、頂点ノードおよびその子孫ノードを追加すること）を意味する。ここで、前者のツリーを被挿入側ツリー、後者を挿入側ツリーと称する。実際には、被挿入側のツリー型データ構造を表す、メモリ上に格納されたＣ−Ｐ配列、および、挿入側のツリー型データ構造を表す、メモリ上に格納されたＣ−Ｐ配列から、挿入側ツリーが挿入された状態で、それぞれのノードのノード識別子が、幅優先モードにしたがって付されたようなＣ−Ｐ配列をメモリ中に生成することである。なお、被挿入側ツリーおよび／または挿入側ツリーが、単一のノードのみで構成されていても良い。【０１１５】
以下、本実施の形態において、幅優先モードで、ツリー型データ構造が表され、幅優先モードにしたがって、ツリーを構成するノードのノード識別子を格納したＣ−Ｐ配列がメモリに記憶されている場合の、ツリーの挿入について説明する。【０１１６】
図２６Ａは、本実施の形態にかかる幅優先モードで表されたツリー型データ構造の一例を視覚的に表す図である。図２６Ａにおいては、ツリー型データ構造２６００を被挿入側ツリーとし、当該被挿入側ツリーのノード識別子「１」のノードと、ノード識別子「２」のノードとの間に、ノード識別子「０」のノード（ルート・ノード：符号２６０１参照）を頂点ノードとするツリーを挿入側ツリー（符号２６１０参照）として、挿入することを考える。すなわち、挿入側ツリーのノード識別子「０」のノードは、被挿入側ツリーのノード識別子「０」のノードの子ノードとして連結される。本例では、被挿入側ツリーのノード識別子「０」のノードには、既に、被挿入側ツリーのノード識別子「１」のノード及びノード識別子「２」のノードが子ノードとして連結されている。挿入側ツリーのノード識別子「０」のノードは、この被挿入側ツリーのノード識別子「１」のノードより下位であり、ノード識別子「２」のノードより上位である子ノードとして被挿入側ツリーのノード識別子「０」のノードの子ノードとして連結される。【０１１７】
図２６Ｂは、ツリー２６００およびツリー２６１０を、それぞれ、Ｃ−Ｐ配列にて表したものである。図２６Ｂに示すように、挿入前の段階では、それぞれのツリーは、幅優先モードにしたがって、そのノードに番号（ノード識別子）が付され、その情報が、配列としてメモリ中に記憶されている。たとえば、オペレータが、入力装置２４を操作して、表示装置２６の画面上に表示された、図２６Ａに示すようなツリー型データ構造を参照して、ツリーの挿入位置（符号２６０２参照）を指定することができる。上記オペレータの指定により、ツリー２６００に関するＣ−Ｐ配列において、ツリー２６１０に関するＣ−Ｐ配列の挿入位置を見出すことも可能である（符号２６２１参照）。【０１１８】
図２７は、本実施の形態にかかるツリー挿入の概略を示すフローチャートである。なお、オペレータによる入力装置２４の操作によって、被挿入側ツリーのＣ−Ｐ配列、挿入側ツリーのＣ−Ｐ配列、および、挿入側ツリーの頂点ノードを挿入すべき位置が予め与えられている。挿入側ツリーの頂点ノードを挿入すべき位置は、たとえば、どのノードの子であるのかという情報（挿入側ツリーの頂点ノードの親ノードとなる、被挿入側ツリーのノード識別子）、および、挿入側ツリーの頂点ノードが、親ノードの何番目の子であるかを示す情報により特定され得る。したがって、ＣＰＵ１２は、オペレータの入力にしたがって、これら情報を取得して、メモリ中に一時的に記憶しておけばよい。【０１１９】
図２７に示すように、ＣＰＵ１２は、まず、被挿入側ツリーに関して、挿入マーク配列を生成する（ステップ２７０１）。図２８は、挿入マーク配列の生成処理をより詳細に示すフローチャートである。図２８に示すように、ＣＰＵ１２は、まず、被挿入側ツリーのＣ−Ｐ配列と同じサイズの挿入マーク配列の領域をメモリ中に確保し（ステップ２８０１）、それぞれの要素として初期値「０」を格納する（ステップ２８０２）。ＣＰＵ１２は、処理対象位置を「０」に初期化して（ステップ２８０３）、処理対象位置の値が、挿入位置直後のノード識別子と同じであるか否かを判断する（ステップ２８０４）。ステップ２８０４でノー(No)と判断された場合には、ＣＰＵ１２は、被挿入側ツリーのＣ−Ｐ配列中、処理対象位置の値、つまり、親ノードのノード識別子を参照し、挿入マーク配列中、当該親ノードのノード識別子の示す位置の要素がマークされているか否か（つまり、値が「１」であるか否か）を判断する（ステップ２８０５）。【０１２０】
ステップ２８０４でイエス(Yes)と判断された場合、或いは、ステップ２８０５でイエス(Yes)と判断された場合には、ＣＰＵ１２は、挿入マーク配列中、処理対象位置の値を「１」にする（ステップ２８０６）。ＣＰＵ１２は、このような処理を、被挿入側ツリーの全てのノード識別子について実行する（ステップ２８０７、２８０８参照）。【０１２１】
図２９は、被挿入側ツリーのＣ−Ｐ配列、および、生成される挿入マーク配列（図中、「Ｉｎｓｅｒｔ  Ｍａｒｋ」と表記している。）の例を示す図である。この例では、被挿入側ツリーにおいて、ノード識別子「１」のノードと、ノード識別子「２」のノードとの間に、挿入側ツリーが挿入されると考えている。図２９の挿入マーク配列に示すように、処理対象位置が「０」、「１」であるときには、ステップ２８０４およびステップ２８０５でノー(No)と判断される。その一方、処理対象位置が「２」であるときには、「２」という値は、挿入位置直後のノード識別子と一致するため、ステップ２８０４でイエス(Yes)と判断され、挿入マーク配列中、格納位置番号「２」の値が「１」にセットされる（符号２９０１参照）。【０１２２】
処理対象位置が「３」、「４」のときには、ステップ２８０４およびステップ２８０５でノー(No)と判断される。処理対象位置が「５」のときには、Ｃ−Ｐ配列中、対応する格納位置番号「５」の値が「２」であり、親ノードのノード識別子が「２」であることがわかる。ＣＰＵ１２は、挿入マーク配列中、格納位置番号「２」の値が「１」であることから、ステップ２８０５でイエス(Yes)と判断される。したがって、挿入マーク配列中、格納位置番号「５」の値が「１」にセットされる（符号２９０２参照）。処理対象位置「６」〜「９」についても同様の処理が実行されることで、最終的な挿入マーク配列を得ることができる。【０１２３】
ＣＰＵ１２は、被挿入側ツリー、挿入側ツリーのそれぞれにおいて、ツリーを構成する各ノードの深さを示すレベル値を格納するレベル配列を、メモリ中に生成する（ステップ２７０２）。同じ世代のノードは、同じレベル値を有する。たとえば、被挿入側ツリーにおいて、Ｃ−Ｐ配列の先頭のノード（ルート・ノード）については、ＣＰＵ１２は、レベル配列中、レベル値「０」を格納する。それ以外のノードについては、ＣＰＵ１２は、Ｃ−Ｐ配列を参照して、親ノードを特定し、当該親ノードのレベル値を参照して、そのレベル値に「１」を加えて、そのノードのレベル値を算出する。次いで、ＣＰＵ１２は、レベル配列中の対応する位置に、算出されたレベル値を格納する。【０１２４】
挿入側ツリーについては、まず、ＣＰＵ１２は、同様の処理を実行してレベル配列に値を格納する。次いで、ＣＰＵ１２は、メモリに一時的に記憶された、挿入側ツリーの頂点ノードを挿入すべき位置を示す情報のうち、挿入側ツリーの頂点ノードの親ノードとなる、被挿入側ツリーのノードのノード識別子を参照して、当該ノード識別子に対応するレベル配列の値（これを親ノードのレベル値と称する）を取得する。さらに、ＣＰＵ１２は、挿入側ツリーのレベル配列の値のそれぞれに、「親ノードのレベル値＋１」を加算する。加算後のレベル値を格納したレベル配列が、挿入側ツリーのレベル配列となる。【０１２５】
図３０Ａは被挿入側ツリーのレベル配列を説明する図である。図３０Ａ、Ｂにおいては、レベル配列は、「Ｌｅｖｅｌｓ」と表記されている。先頭のノード（ノード識別子「０」のルート・ノード）については、レベル配列中のレベル値として「０」が格納される。引き続く２つのノード（ノード識別子「１」、「２」のノード）については、それぞれ親ノードのノード識別子が「０」であるため、「０」に「１」を加えた値「１」が、レベル値として、レベル配列に格納されている。図３０Ｂは、挿入側ツリーのレベル配列を説明する図である。符号３０１０に示す配列は、被挿入側ツリーと同様の処理が実行された状態の配列、符号３０２０に示す配列は、さらに、それぞれのレベル値に、「親ノードのレベル値＋１＝１」を加えた、最終的な配列の状態を示す。【０１２６】
ＣＰＵ１２は、被挿入側ツリーのＣ−Ｐ配列、レベル配列および挿入マーク配列、並びに、挿入側ツリーのＣ−Ｐ配列およびレベル配列を参照して、それぞれのツリーについて、新規ノード識別子配列を生成する（ステップ２７０３）。図３１および図３２は、新規ノード識別子の生成をより詳細に示すフローチャートである。図３１に示すように、ＣＰＵ１２は、挿入側ツリーおよび被挿入側ツリーの双方に関して、それぞれのＣ−Ｐ配列と同じサイズの、新規ノード識別子配列の領域をメモリ中に確保する（ステップ３１０１）。また、ＣＰＵ１２は、カレントノード識別子領域（図中、「Ｃｕｒｒｅｎｔ  Ｎｏｄｅ  Ｎｏ．」と表記する。）をメモリ中に確保して、初期値「０」を格納し（ステップ３１０２）、被挿入側ツリー、挿入側ツリーの双方の処理対象位置を「０」に初期化する（ステップ３１０３）。【０１２７】
ＣＰＵ１２は、挿入マーク配列中、被挿入側の処理対象位置の値を参照し（ステップ３１０４）、先の処理対象位置の値が「０」でかつ今回の処理対象位置の値が「１」であるかどうかを判断する（ステップ３１０５）。なお、最初の処理では、挿入マーク配列の値が「１」であれば、ステップ３１０５でイエス(Yes)と判断される。ステップ３１０５でノー(No)と判断された場合には、被挿入側の新規ノード識別子配列中、被挿入側処理対象位置の値として、カレントノード識別子領域の値を格納する（ステップ３１０６）。【０１２８】
その一方、ステップ３１０５でイエス(Yes)と判断された場合には、処理対象が挿入側ツリーに移行する。なお、この挿入側処理対象位置における挿入側ツリーのレベル配列中のレベル値は、被挿入側処理対象位置における被挿入側ツリーのレベル配列中のレベル値と同一となる。【０１２９】
より詳細には、図３２に示すように、ＣＰＵ１２は、挿入側の新規ノード識別子配列中、挿入側処理対象位置の値として、カレントノード識別子領域の値を格納する（ステップ３２０１）。次いで、ＣＰＵ１２は、カレントノード識別子領域の値をインクリメントするとともに、挿入側処理対象位置もインクリメントする（ステップ３２０２）。ＣＰＵ１２は、新たな挿入側処理対象位置について、レベル配列の値を参照して、レベル配列の値が変化したか否かを判断する（ステップ３２０３）。インクリメント前の挿入側処理対象位置の、レベル配列の値と、インクリメント後の挿入側処理対象位置の、レベル配列の値とが一致していれば、ステップ３２０３でノー(No)と判断されて、ステップ３２０１に戻り、処理が進められる。その一方、ステップ３２０３でイエス(Yes)と判断された場合には、ステップ３１０６に進む。【０１３０】
被挿入側ツリーおよび挿入側ツリーについて、処理が終了したとき、つまり、それぞれ新規ノード識別子配列への格納が完了したときに、ステップ３１０７でイエス(Yes)と判断される。それ以外の場合には、ＣＰＵ１２は、カレントノード識別子領域の値をインクリメントするとともに、被挿入側の処理対象位置をインクリメントする（ステップ３１０８）。【０１３１】
図３３〜図３７Ｂを参照して、上記図３１および図３２の処理をより具体的に説明する。図３３は、新規ノード識別子配列の領域や、初期値「０」が格納されたカレントノード識別子領域が、メモリ中に確保された状態を示す。また、被挿入側ツリー、挿入側ツリーともに、処理対象位置は「０」である。【０１３２】
図３４Ａに示すように、被挿入側の処理対象位置が「０」のときには、挿入マーク配列中、その位置の値が「０」であり、被挿入側の新規ノード識別子配列中、その格納位置番号「０」の値として、カレントノード識別子領域の値「０」が格納される。その後、カレントノード識別子領域の値がインクリメントされて「１」になる。【０１３３】
図３４Ｂに示すように、被挿入側の処理対象位置が「１」のときにも、挿入マーク配列中、その位置の値が「０」であり、図３４Ａに示すときの挿入マーク配列の値「０」と同じく変化が無い。したがって、被挿入側の新規ノード識別子配列中、その格納位置番号「１」の値として、カレントノード識別子領域の値「１」が格納される。その後、カレントノード識別子領域の値がインクリメントされて「２」になる。【０１３４】
図３５Ａに示すように、被挿入側の処理対象位置が「２」のときには、挿入マーク配列中、その位置の値が「１」であり、図３４Ｂに示すときの挿入マーク配列の値「０」から変化している。そこで、ステップ３１０５でイエス(Yes)と判断される。したがって、挿入側ツリーに関する処理に移り、挿入側の新規ノード識別子配列中、その格納位置番号「０」の値として、カレントノード識別子領域の値「２」が格納される。その後、カレントノード識別子領域の値がインクリメントされて「３」になるとともに、挿入側の処理対象位置がインクリメントされて「１」となる。ここで、レベル配列中、挿入側の処理対象位置「１」の値は「２」であり、インクリメント前の処理対象位置「０」のレベル配列の値「１」と同一ではない。したがって、図３１のステップ３１０６の処理に移行し、新規ノード識別子配列中、被挿入側の処理対象位置「２」の値として、カレントノード識別子領域の値「３」を格納する。その後、カレントノード識別子領域の値はインクリメントされて「４」となる（図３５Ｂ参照）。【０１３５】
図３６Ａ、Ｂに示すように、被挿入側の処理対象位置が「３」、「４」のときには、被挿入側の新規ノード識別子配列に値が格納される。図３７Ａに示すように、被挿入側の処理対象位置が「５」のときには、挿入マーク配列の値が「１」に変化しているので、挿入側の新規ノード識別子配列に値が格納され、その後、被挿入側の新規ノード識別子配列に値が格納される。【０１３６】
このような処理を繰り返すことにより、図３７Ｂに示すように、被挿入側、挿入側のそれぞれにおいて、ツリーの挿入による新たなノード識別子を格納した新規ノード識別子配列を得ることができる。【０１３７】
次いで、ＣＰＵ１２は、新規ノード識別子配列に基づいて、被挿入側ツリーおよび挿入側ツリーのＣ−Ｐ配列を、メモリ中に生成する（ステップ２７０４）。それぞれのＣ−Ｐ配列を取得するためには、被挿入側ツリーおよび挿入側ツリーのそれぞれについて、図２１に示す処理と同様の処理を実行すればよい。実際には、格納アドレス算出処理を実行する必要はなく、ＣＰＵ１２は、親ノードのノード識別子の算出（図２１のステップ２１０６〜２１０８）を実行すれば、被挿入側ツリーおよび挿入側ツリーのそれぞれのＣ−Ｐ配列を求めることができる。なお、ここで、親ノード識別子配列のそれぞれの値と、新規ノード識別子配列の同じ格納位置の値とを関連付けておく。【０１３８】
図３８Ａは、被挿入側について、新たなＣ−Ｐ配列が得られた状態を示す図、図３８Ｂは、挿入側について新たなＣ−Ｐ配列が得られた状態を示す図である。なお、図３８Ｂにおいて、挿入側については、ＣＰＵ１２は、図２１のステップ２１０６〜２１０８に示す処理を実行して、新たなＣ−Ｐ配列（符号３８０１参照）を得て、その後、ＣＰＵ１２は、ルート・ノード（Ｃ−Ｐ配列の値が「−１」のノード）については、挿入したときに親ノードとなるノードのノード識別子（この例では「０」）を格納する（符号３８０２参照）。【０１３９】
さらに、ＣＰＵ１２は、被挿入側ツリーおよび挿入側ツリーの新たなＣ−Ｐ配列をマージして、挿入後のＣ−Ｐ配列を生成する（ステップ２７０５）。図３９に示すように、被挿入側の新たなＣ−Ｐ配列（符号３９０１参照）においては、挿入側ツリーの親ノードのノード識別子が入るべき部分の値が存在せず、その一方、挿入側の新たなＣ−Ｐ配列（符号３９０２参照）においても、被挿入側ツリーの親ノードのノード識別子が入るべき部分の値が存在しない。したがって、無効値以外が格納されている部分を相互に利用して配列を生成すれば、挿入後のＣ−Ｐ配列となる（符号３９１０参照）。【０１４０】
図４０Ａは、挿入側ツリー挿入前の、被挿入側ツリーを表す図である。図３９の符号３９１０に示すＣ−Ｐ配列によれば、図４０Ａのツリーに、挿入側ツリーを挿入することにより、模式的には、図４０Ｂに示すようなトポロジーが得られる。これは、先に述べた幅優先モードにしたがっていることは言うまでも無い。【０１４１】
［実際のデータ管理］
上述したように、本実施の形態によれば、幅優先モードの下で、ツリー型データ構造が表現されている場合に、被挿入側ツリーに挿入側ツリーを挿入した状態においても、幅優先モードの下で、ツリー型データ構造が表現されるように、Ｃ−Ｐ配列を生成している。この処理では、それぞれのノードのノード識別子が変更される。実際には、図２Ａ、Ｂを参照して説明したように、ツリー型データ構造においては、一つのツリーを構成するノードのそれぞれにノードタイプおよびノード値が関連付けられている。ノードタイプは必須ではないが、当該ノードの値の意味を表すため（たとえば、図２Ｂにおいては、値「フランス店」が、「店名」であることを表している。）に存在する。【０１４２】
図４１Ａは、図２６Ａなどで例示した、被挿入側ツリーを模式的に表す図である。図４１Ｂは、当該被挿入側ツリーを表す、メモリ中に記憶されたＣ−Ｐ配列、および、それぞれのノード識別子に関連付けられてメモリ中に記憶された、ノード値の格納配列の例を示す図である。図４１Ｂに示すように、この例では、ノードには、「パーツ名」（図中、「ＰＡＲＴＳ−ＮＡＭＥ」と表記している）というノード値のみが格納され、ノードタイプは設けられていない。図４１Ａにおいても、ノード識別子とともに、そのノード値を記載している。例示したツリーは、模型飛行機（ＴＯＹ  ＰＬＡＮＥ）の部品を示し、それぞれのノードが、部品名を表している。【０１４３】
図４２Ａは、同様に、図２６Ａなどで例示した、挿入側ツリーを模式的に表す図である。図４２Ｂは、当該挿入側ツリーを表す、メモリ中に記憶されたＣ−Ｐ配列、および、それぞれのノード識別子に関連付けられてメモリ中に記憶された、ノード値の格納配列の例を示す図である。図４２Ａにおいても、ノード識別子とともにそのノード値を記載している。【０１４４】
本実施の形態におけるツリー挿入処理によって、新たなＣ−Ｐ配列が生成される。ＣＰＵ１２は、図３８Ａ、Ｂにそれぞれ示す、被挿入側および挿入側新規ノード識別子配列を参照することで、被挿入側ツリーのノード識別子が、挿入後のツリー構造において、新たにどのようなノード識別子が与えられたか、或いは、挿入側ツリーのノード識別子が、挿入後のツリー構造において、新たにどのようなノード識別子が与えられたかを把握することができる。したがって、ＣＰＵ１２は、新たなＣ−Ｐ配列の生成とともに、新たなノード識別子に関連付けられたノード値を格納した格納配列を生成する。図４３Ａは、挿入後のツリーを模式的に示す図、図４３Ｂは、メモリに記憶された新たなＣ−Ｐ配列、および、メモリに記憶された新たなノード値の格納配列を示す図である。【０１４５】
図４３Ｂに示すように、新たなノード値の格納配列を生成する際に、ＣＰＵ１２は、被挿入側ツリーのノード値の格納配列の挿入位置を特定し、当該挿入位置に、挿入側ツリーのノード値の格納配列の挿入すべき値を挿入しても良い。或いは、ＣＰＵ１２は、新たに、ノード値の格納配列のための領域をメモリ中に確保し、新たなノード識別子に対応する位置に、被挿入側ツリーのノード値の格納配列の値或いは挿入側ツリーのノード値の格納配列の値の何れかを格納するような処理を実行しても良い。【０１４６】
部分ツリーの削除の際にも、ＣＰＵ１２は、同様に、新規ノード識別子配列（図２０参照）を参照することで、部分ツリーの削除後に、削除によって残ったノードのそれぞれに与えられた新たなノード識別子を知ることができる。したがって、ＣＰＵ１２は、ノード値の格納配列から削除位置の値を削除することが可能である。或いは、ＣＰＵ１２は、新たに、格納配列のための領域をメモリ中に確保し、新たなノード識別子に対応する位置に、元の格納配列の値を格納するような処理を実行しても良い。【０１４７】
［機能ブロックダイヤグラム］
図４４は、本発明の実施の形態にかかるツリー型データ構造を構築する情報処理装置の機能ブロックダイヤグラムであるである。図４４に示すように、情報処理装置４４００は、ツリー型データ構造を表現するデータを記憶する記憶部４４０１と、本実施の形態にかかる、ツリー型データ構造を表現するためのＣ−Ｐ配列を生成して記憶装置中に記憶するツリー定義部４４０２、ツリー挿入処理部４４０３と、ツリー削除処理部４４０４と、を有する。【０１４８】
ツリー挿入処理部４４０３は、オペレータが入力装置（図４４では図示せず）を操作して入力した被挿入側ツリーおよび挿入側ツリーを特定する情報や、その挿入位置を特定する情報に基づいて、記憶部４４０１から処理対象となるツリーのＣ−Ｐ配列などを読み出して、挿入後のツリー型データ構造を表現するＣ−Ｐ配列を生成して、当該Ｃ−Ｐ配列を記憶部４４０１に記憶する。また、ツリー挿入処理部４４０３は、ノード値の格納配列を、ツリーの挿入にしたがって更新し、或いは、ツリーの挿入に従った新たな格納配列を生成する。【０１４９】
ツリー削除処理部４４０４は、オペレータが入力装置を操作して入力した削除対象となる部分ツリーの頂点ノードのノード識別子に基づいて、記憶部４４０１から、処理対象となるツリーのＣ−Ｐ配列などを読み出して、部分ツリーの削除後のツリー型データ構造を表現するＣ−Ｐ配列を生成して、当該Ｃ−Ｐ配列を記憶部４４０１に記憶する。また、ツリー削除処理部４４０４は、ノード値の格納配列を、部分ツリーの削除にしたがって更新し、或いは、部分ツリーの削除にしたがった新たな格納配列を生成する。【０１５０】
本実施の形態においては、ノードに付与された固有のノード識別子は、子ノードよりも同じ世代のノードを優先して付与された連続する整数である。また、被挿入側ツリー、挿入側ツリーのそれぞれにおいて、ノード間の親子関係は、非ルート・ノードの各々に付与されたノード識別子の順に関連付けられた非ルート・ノードの各々の親ノードに付与されたノード識別子からなる配列Ｃ−Ｐ配列）によって表現される。ツリー定義部４４０２は、たとえば、記憶部４４０１や他の記憶装置に記憶された、ＸＭＬ形式で与えられたツリーのデータを読み出して、ツリーを構成するノードについて、ノード識別子を付与して、そのノード識別子ごとに、そのノードの親ノードのノード識別子を格納したＣ−Ｐ配列を記憶部４４０１に記憶する。また、ツリー定義部４４０２は、ＸＭＬ形式で与えられたツリーのデータのうち、それぞれのノードに関連付けられた実データ（ノードタイプおよびノード値）を、ノード識別子と関連付けて格納した格納配列を生成して、これを、記憶部４４０１に記憶する。【０１５１】
本発明は、以上の実施の形態に限定されることなく、特許請求の範囲に記載された発明の範囲内で、種々の変更が可能であり、それらも本発明の範囲内に包含されるものであることは言うまでもない。【０１５２】
たとえば、本実施の形態においては、ツリー削除を、子ノードよりも同じ世代のノードを優先する幅優先モードにしたがってツリー型データ構造を表現した構成に適用している。つまり、幅優先モードに基づいてノードの各々に付与されたノード識別子に関する親子関係定義配列（Ｃ−Ｐ配列）から、部分ツリー削除後の、幅優先モードにしたがった新たなＣ−Ｐ配列を生成している。しかしながら、本発明にかかるツリー削除は、同じ世代のノードよりも子ノードを優先する深さ優先モードにしたがってツリー型データ構造を表現した構成にも適用可能である。【０１５３】
図４５は、深さ優先モードで表されたツリー型データ構造の一例を示す図である。これは、図１５に示すツリー型データ構造のトポロジーと同一である。以下、図４５のツリー型データ構造において、符号４５０１に示すノードを頂点ノードとする部分ツリーを削除する場合を考える。【０１５４】
図４６は、図４５に示すツリー型データ構造の親子関係を表す配列（Ｃ−Ｐ配列）、初期値が格納されたデリートフラグ配列、新規ノード識別子配列、および、初期値が配置されたカレントノード識別子領域を示す図である。これは、幅優先モードにおける図１７に対応する。図４６中のデリートフラグ配列は、図１６のステップ１６０２が実行された時点のものである。【０１５５】
図４７は、深さ優先モードにおけるツリー削除処理を説明する図であり、図１６に示す処理が終了した時点の、デリートフラグ配列、新規ノード識別子配列、カレントノード番号領域の状態を示している。【０１５６】
図４８Ａ、Ｂは、それぞれ、図２１の処理を実行した場合の格納アドレス配列および親ノード識別子配列を示し、図４８Ｃは、図２１のステップ２１１１が実行されることにより得られた、部分ツリー削除後の、深さ優先モードにしたがった新たなＣ−Ｐ配列を示す図である。このＣ−Ｐ配列に基づくツリー型データ構造のトポロジーは、図４９Ｂに示すものとなる。部分ツリー削除前のツリー型データ構造を表す図４９Ａと比較すると、符号４５０１に示すノードを頂点ノードとする部分ツリーが削除されていることがわかる。【０１５７】
なお、本発明にかかるツリー削除方法は、上記幅優先モード或いは深さ優先モード以外にも適用可能である。実際には、
（１）初期値より連続する整数であり、
（２）親子関係のあるノードについて、親ノードのノード識別子は子ノードのノード識別子より小さいように、
ノードにノード識別子が付与され、記憶装置に、各ノードの親ノードのノード識別子を格納した親子関係定義配列（Ｃ−Ｐ配列）を保持しておけば、本発明にかかるツリー削除方法を適用することができる。
【図面の簡単な説明】
【０１５８】
【図１】図１は、本発明の実施の形態にかかるツリー型データ構造を取り扱う情報処理装置のハードウェア構成を示すブロックダイヤグラムである。
【図２】図２Ａ、Ｂは、ツリー型データの一例であるＰＯＳデータの説明図であり、図２Ａは、このツリー型データのデータ構造（即ち、トポロジー）及びデータ値を視覚的に表現した例であり、図２Ｂは、同じツリー型データをＸＭＬ形式で表現した例である。
【図３】図３Ａ〜Ｃは、アークリストを用いたツリー型データ構造の表現形式の一例の説明図である。
【図４】図４Ａ〜Ｃは、本発明の実施の形態にかかる、「子→親」関係に基づくツリー型データ構造の表現方法の説明図である。
【図５】図５は、本発明の実施の形態にかかる、ツリー型データ構造を記憶装置上に構築する方法のフローチャートである。
【図６】図６Ａ〜Ｃは、本発明の実施の形態にしたがって、ＩＤ形式のツリー構造型データを整数連番形式のツリー構造型データへ変換する処理の説明図である。
【図７】図７Ａ〜Ｃは、本発明の他の一実施例によりＩＤ形式のツリー構造型データを整数連番形式のツリー構造型データへ変換する処理の説明図である。
【図８】図８は、本発明の実施の形態にかかる深さ優先に基づくノード定義処理のフローチャートである。
【図９】図９は、本発明の実施の形態において作成された「子→親」表現に基づく親子関係の配列の説明図である。
【図１０】図１０は、図６Ｃに示された深さ優先のツリー型データ構造から作成された「親→子」表現に基づく親子関係の配列の説明図である。
【図１１】図１１は、本発明の実施の形態にかかる幅優先に基づくノード定義処理のフローチャートである。
【図１２】図１２は、本発明の実施の形態において作成された「子→親」表現に基づく親子関係の配列の説明図である。
【図１３】図１３は、図７Ｃに示された深さ優先のツリー型データ構造から作成された「親→子」表現に基づく親子関係の配列の説明図である。
【図１４】図１４は、本発明の実施の形態にかかる、三つの表現形式の相互変換の関係を示す図である。
【図１５】図１５は、本実施の形態にかかる幅優先モードで表されたツリー型データ構造の一例を模式的に表す図である。
【図１６】図１６は、本実施の形態にかかるツリー削除処理の前半（ツリー削除処理（１））を示すフローチャートである。
【図１７】図１７は、図１５に示すツリー型データ構造の親子関係を表す配列、初期値が格納されたデリートフラグ配列、新規ノード識別子配列、および、初期値が配置されたカレントノード識別子領域を示す図である。
【図１８】図１８Ａ、Ｂは、本実施の形態にかかるツリー削除処理を説明する図である。
【図１９】図１９Ａ、Ｂは、本実施の形態にかかるツリー削除処理を説明する図である。
【図２０】図２０は、本実施の形態にかかるツリー削除処理を説明する図である。
【図２１】図２１は、ツリー削除後のＣ−Ｐ配列の生成のための処理（ツリー削除処理（２））を示すフローチャートである。
【図２２】図２２Ａ〜Ｄは、ステップ２１０３およびステップ２１０４にて実行される処理を具体的に説明する図である。
【図２３】図２３Ａ〜Ｄは、ステップ２１０６〜２１０８にて実行される処理を具体的に説明する図である。
【図２４】図２４ＡおよびＢは、それぞれ、図２２Ａ〜Ｄの処理で得られた格納アドレス配列、および、図２３Ａ〜Ｄの処理で得られた親ノード識別子配列の例、図２４Ｃは、格納アドレス配列および親ノード識別子配列に基づいて得られた新たなＣ−Ｐ配列である。
【図２５】図２５Ａは、図１５と同じツリー型データ構造の例を視覚的に表した図、図２５Ｂは、図２４Ｃに示すＣ−Ｐ配列に基づいて、ツリー型データ構造を視覚的に表した図である。
【図２６】図２６Ａ、Ｂは、本実施の形態にかかる、被挿入側ツリーおよび挿入側ツリーの例を示す図である。
【図２７】図２７は、本実施の形態にかかるツリー挿入の概略を示すフローチャートである。
【図２８】図２８は、挿入マーク配列の生成処理をより詳細に示すフローチャートである。
【図２９】図２９は、被挿入側ツリーのＣ−Ｐ配列、および、生成される挿入マーク配列の例を示す図である。
【図３０】図３０Ａ、Ｂは、それぞれ、被挿入側ツリーおよび挿入側ツリーのレベル配列を説明する図である。
【図３１】図３１は、新規ノード識別子の生成をより詳細に示すフローチャートである。
【図３２】図３２は、新規ノード識別子の生成をより詳細に示すフローチャートである。
【図３３】図３３は、新規ノード識別子の生成を具体的に説明する図である。
【図３４】図３４Ａ、Ｂは、新規ノード識別子の生成を具体的に説明する図である。
【図３５】図３５Ａ、Ｂは、新規ノード識別子の生成を具体的に説明する図である。
【図３６】図３６Ａ、Ｂは、新規ノード識別子の生成を具体的に説明する図である。
【図３７】図３７Ａ、Ｂは、新規ノード識別子の生成を具体的に説明する図である。
【図３８】図３８Ａは、被挿入側について、新たなＣ−Ｐ配列が得られた状態を示す図、図３８Ｂは、挿入側について新たなＣ−Ｐ配列が得られた状態を示す図である。
【図３９】図３９は、挿入側ツリーの挿入後のＣ−Ｐ配列を示す図である。
【図４０】図４０Ａは、挿入側ツリー挿入前の、被挿入側ツリーを視覚的に表す図、図４０Ｂは、挿入側ツリーの挿入後のツリーを視覚的に表す図である。
【図４１】図４１Ａは、被挿入側ツリーを模式的に表す図、図４１Ｂは、当該被挿入側ツリーを表す、メモリ中に記憶されたＣ−Ｐ配列、および、それぞれのノード識別子に関連付けられてメモリ中に記憶された、ノード値の格納配列の例を示す図である。
【図４２】図４２Ａは、挿入側ツリーを模式的に表す図である。図４２Ｂは、当該挿入側ツリーを表す、メモリ中に記憶されたＣ−Ｐ配列、および、それぞれのノード識別子に関連付けられてメモリ中に記憶された、ノード値の格納配列の例を示す図である。
【図４３】図４３Ａは、挿入後のツリーを模式的に示す図、図４３Ｂは、メモリに記憶された新たなＣ−Ｐ配列、および、メモリに記憶された新たなノード値の格納配列を示す図である。
【図４４】図４４は、本発明の実施の形態にかかるツリー型データ構造を構築する情報処理装置の機能ブロックダイヤグラムであるである。
【図４５】図４５は、本実施の形態にかかる深さ優先モードで表されたツリー型データ構造の一例を示す図である。
【図４６】図４６は、図４５に示すツリー型データ構造の親子関係を表す配列、初期値が格納されたデリートフラグ配列、新規ノード識別子配列、および、初期値が配置されたカレントノード識別子領域を示す図である。
【図４７】図４７は、深さ優先モードにおけるツリー削除処理を説明する図である。
【図４８】図４８ＡおよびＢは、それぞれ、図２２Ａ〜Ｄの処理で得られた格納アドレス配列、および、図２３Ａ〜Ｄの処理で得られた親ノード識別子配列の例、図４８Ｃは、部分ツリー削除後のＣ−Ｐ配列を示す図である。
【図４９】図４９Ａ、Ｂは、深さ優先モードにおけるツリー削除処理を説明する図である。
【符号の説明】
【０１５９】
１０        情報処理装置
１２        ＣＰＵ
１４        ＲＡＭ
１６        ＲＯＭ
１８        固定記憶装置
２０        ドライバ
２２        Ｉ／Ｆ
２４        入力装置
２６        表示装置
４４００    情報処理装置
４４０１    記憶部
４４０２    ツリー定義部
４４０３    ツリー挿入処理部
４４０４    ツリー削除処理部
【図１】
2007020850.tif 000002
【図２】
2007020850.tif 000003
【図３】
2007020850.tif 000004
【図４】
2007020850.tif 000005
【図５】
2007020850.tif 000006
【図６】
2007020850.tif 000007
【図７】
2007020850.tif 000008
【図８】
2007020850.tif 000009
【図９】
2007020850.tif 000010
【図１０】
2007020850.tif 000011
【図１１】
2007020850.tif 000012
【図１２】
2007020850.tif 000013
【図１３】
2007020850.tif 000014
【図１４】
2007020850.tif 000015
【図１５】
2007020850.tif 000016
【図１６】
2007020850.tif 000017
【図１７】
2007020850.tif 000018
【図１８】
2007020850.tif 000019
【図１９】
2007020850.tif 000020
【図２０】
2007020850.tif 000021
【図２１】
2007020850.tif 000022
【図２２】
2007020850.tif 000023
【図２３】
2007020850.tif 000024
【図２４】
2007020850.tif 000025
【図２５】
2007020850.tif 000026
【図２６】
2007020850.tif 000027
【図２７】
2007020850.tif 000028
【図２８】
2007020850.tif 000029
【図２９】
2007020850.tif 000030
【図３０】
2007020850.tif 000031
【図３１】
2007020850.tif 000032
【図３２】
2007020850.tif 000033
【図３３】
2007020850.tif 000034
【図３４】
2007020850.tif 000035
【図３５】
2007020850.tif 000036
【図３６】
2007020850.tif 000037
【図３７】
2007020850.tif 000038
【図３８】
2007020850.tif 000039
【図３９】
2007020850.tif 000040
【図４０】
2007020850.tif 000041
【図４１】
2007020850.tif 000042
【図４２】
2007020850.tif 000043
【図４３】
2007020850.tif 000044
【図４４】
2007020850.tif 000045
【図４５】
2007020850.tif 000046
【図４６】
2007020850.tif 000047
【図４７】
2007020850.tif 000048
【図４８】
2007020850.tif 000049
【図４９】
2007020850.tif 000050
【国際調査報告】
2007020850.tif 000051
2007020850.tif 000052
2007020850.tif 000053
2007020850.tif 000054