目次:
1つは、ツリーのストレージ構造です。
(1)親の代表
成し遂げる:ツリーのノードを格納する構造配列を定義します。各ノードには2つのフィールドが含まれます。
データフィールド:ノード自体の情報を格納します。
親フィールド:配列内のノードの親ノードの位置を示します。
特徴: 親を見つけるのは簡単ですが、子供を見つけるのは難しいです
#define MAX_TREE_SIZE 100
typedef struct PTNode
{
//结点结构
ElemType data;
int parent;//保存双亲位置
}PTNode;
typedef struct
{
//定义树结构
PTNode nodes[MAX_TREE_SIZE];
int r, n;//根的位置和结点数
}PTree;
(2)子リンクリスト表記(親-親との子リンクリスト)
//孩子链表表示法的类型描述
typedef struct CTNode
{
int child;
struct CTNode* nextchild;
}*ChildPtr;
//双亲结点结构
typedef struct
{
ElemType data;
int parent;//保存双亲位置
ChildPtr firstchild;//孩子链的头指针
}CTBox;
//树结构
typedef struct
{
CTBox nodes[MAX_TREE_SIZE];
int n, r;//结点数和根结点的位置
}CTree;
(3)ツリーのバイナリリンクリスト(子-兄弟)のストレージ表現
/*树的二叉链表类型描述*/
typedef struct CSNode
{
ElemType data;
struct CSNode* firstchild, * nextsibling;
}CSNode,*CSTree;
第二に、フォレストとバイナリツリー間の変換
(1)ツリーをバイナリツリーに変換します
行を追加: 兄弟間のつながりを追加する
スレッドをワイプします。 左端の子を除く各ノードについて、残りの子との関係を削除します
回転: ツリーのルートノードを軸として、ツリー全体を時計回りに45度回転させます。
ツリーから変換されたバイナリツリー。ルートノードの右側のサブツリーは空である必要があります
(2)バイナリツリーをツリーに変換する
行を追加: ノードpが親ノードの左の子である場合、Pの右の子、右の子の右の子...ブランチに沿って見つかったすべての右の子は、線でpの親に接続されます。
スレッドをワイプします。 元のバイナリツリーの親と右の子の間の接続を消去します
調整: ノードを階層的に配置してツリー構造を形成します
(3)フォレストをバイナリツリーに変換します
1.各ツリーをそれぞれバイナリツリーに変換します
。2。各ツリーのルートノードを線で接続します。3。
最初のツリーのルートノードをバイナリツリーのルートとして使用し、次にルートノードをコアとして時計回りに使用します。回転してバイナリツリー構造を形成します
(4)バイナリツリーをフォレストに変換する
スレッドをワイプします。 バイナリツリー内のルートノードとその右の子の間の接続、および右のブランチに沿って見つかった右の子の間のすべての接続を消去して、分離されたバイナリツリーにします。
削減: 分離されたバイナリツリーをツリーに復元する
第三に、木々や森の横断
トラバース: 特定のルールに従ってツリーの頂点をウォークスルーし、各頂点に1回だけアクセスするようにします。つまり、ツリー内のすべてのノードの線形配置を取得するための完全で定期的なウォーキング方法を見つけます。
(1)ツリートラバーサル(ミドルオーダーについては説明しません)
一般的な方法:
1.ルートファースト(順序)トラバーサル:最初にツリーのルートノードにアクセスし
、次にルートの各サブツリーを順番にトラバースします。2。ルート(順序)トラバーサル:各サブツリーを順番にトラバースし、次にルート、次にルートノードにアクセスします。
3.レベルごとのトラバース:最初に最初のレベルのノードにアクセスし、次に2番目のレベル、...、およびN番目のレベルのノードを順番にトラバースします。