ツリーの作成と関連アルゴリズム
9452 ワード
ツリーは非常に重要なデータ構造であり、ブランチ構造の基礎であり、今日はブログを書いて、関連するアルゴリズムとツリーの作成過程を説明します.
1:ツリーの作成:
主に先序、中序、後序、層序がいくつかの方式を作成し、そのうち前の3つは二叉木遍歴方式に基づいている.
(1):シーケンス作成
シーケンス作成とは、ルートノードを作成し、左サブツリーと右サブツリーを順に作成することです.ツリー自体が再帰アルゴリズムに基づいているため、再帰的な方法で実現できます.
(2):中および後に作成:
前の順序でツリーを作成する方法がわかり、中の順序と後続も類比できます.前の順序とは、ルートノードを作成する順序です.
(3):層順遍歴と作成:
:
以上の画像が反映する層順遍歴の過程で、層順遍歴はキューの基礎の上で創立して、まず1粒の二叉木が空でないならば、ルートノードを入隊させて、もしルートノードの左のサブツリーの後で右のサブツリーが空でないならば、ルートノードは出てそのデータドメインの値を印刷して、左の右のサブツリーは前後して入隊して(誰が空いていないで誰が入隊します)、それから1つの再帰的な過程です.
可視レイヤシーケンスループは、上から下へ、左から右へのループプロセスです.
したがって、ツリーを階層的に作成することもできます.まずルートノードを作成し、ルートノードの左の子と右の子のポインタが虚のノードを指していない場合は、左の子ツリーと右の子ツリーを作成し、再帰的に作成します.
ツリーコード:
関数ファイルc:
#include "Bittree.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
tree *Creat(tree* root, tree*(*ptree)(tree *root))
{
root = ptree(root);
return root;
}
tree *Tier_creat(tree* root) // root
{
tree *s = NULL;
datatype data = 0;
tree *Tree_arr[MAX] = { 0 }; //
int front = 1; //front
int rear = 0; //rear
printf(" , -1 ,-2 !
");
scanf("%d", &data);
while (data != -2)
{
s = NULL;
if (data != -1)
{
s =(tree*) malloc(sizeof(tree)* 1);
s->data = data;
s->Lchild = NULL;
s->Rchild = NULL;
}
rear++;
Tree_arr[rear] = s; //
if (rear == 1) root = s; // rear ,
else
{
if (Tree_arr[rear] && s) //
{
if (rear % 2 == 0) Tree_arr[front]->Lchild = s; //
if (rear % 2 == 1)
{
Tree_arr[front]->Rchild = s; //
front++; // rear , ,
}
}
}
scanf("%d", &data);
}
return root;
}
tree *DLR_creat(tree* root) //
{
printf(" -1 , -2
");
root = NULL;
int data = 0;
printf(" :");
scanf("%d", &data);
if (data == -1)
return NULL;
root = (tree*)malloc(sizeof(tree)* 1);
if (root == NULL)
{
printf(" !
");
exit(EXIT_FAILURE);
}
root->data = data;
root->Lchild=DLR_creat(root->Lchild);
root->Rchild = DLR_creat(root->Rchild);
return root;
}
tree *LDR_creat(tree* root) //
{
printf(" -1 , -2
");
root = NULL;
int data = 0;
printf(" :");
scanf("%d", &data);
if (data == -1)
return NULL;
root->Lchild = DLR_creat(root->Lchild);
root = (tree*)malloc(sizeof(tree)* 1);
if (root == NULL)
{
printf(" !
");
exit(EXIT_FAILURE);
}
root->data = data;
root->Rchild = DLR_creat(root->Rchild);
return root;
}
tree *RLD_creat(tree* root) //
{
printf(" -1 , -2
");
root = NULL;
int data = 0;
printf(" :");
scanf("%d", &data);
if (data == -1)
return NULL;
root->Lchild = DLR_creat(root->Lchild);
root->Rchild = DLR_creat(root->Rchild);
root = (tree*)malloc(sizeof(tree)* 1);
if (root == NULL)
{
printf(" !
");
exit(EXIT_FAILURE);
}
root->data = data;
return root;
}
void Print_Tree(tree *root, void(*ptree)(tree *root)) //
{
assert(root);
if (root == NULL)
{
printf(" !
");
return;
}
else
{
ptree(root);
printf("
");
}
}
void DLR_Print(tree *root) //
{
if (root != NULL)
{
printf("%d ", root->data);
DLR_Print(root->Lchild);
DLR_Print(root->Rchild);
}
return;
}
void LDR_Print(tree *root) //
{
if (root != NULL)
{
DLR_Print(root->Lchild);
printf("%d ", root->data);
DLR_Print(root->Rchild);
}
return;
}
void RLD_Print(tree *root) //
{
if (root != NULL)
{
DLR_Print(root->Lchild);
DLR_Print(root->Rchild);
printf("%d ", root->data);
}
return;
}
void Tie_Print(tree *root) //
{
tree* arry[MAX] = { 0 };
int rear = 1;
int front = 0;
if (root == NULL)
{
printf(" !
");
return;
}
else
{
arry[0] = root; // , 。
while (front < rear) //
{
if (arry[front])
{
printf("%d ", arry[front]->data);
arry[rear++] = arry[front]->Lchild;
arry[rear++] = arry[front]->Rchild;
front++;
}
else
{
front++;
}
}
}
}
int Deep_tree(tree *root) //
{
assert(root);
int left = 0;
int right = 0;
int deep = 0;
if (root != NULL)
{
left=Deep_tree(root->Lchild); //
right = Deep_tree(root->Rchild); //
deep = left > right ? (left + 1) : (right + 1);
}
return deep;
}
int Node_du(tree *root) //
{
assert(root);
int ret = 0;
if (root == NULL)
return 0;
else
{
if (root->Lchild != NULL)
ret++;
if (root->Rchild != NULL)
ret++;
return ret;
}
}
int tree_Node(tree *root)
{
assert(root);
int ret = 0;
if (root == NULL)
return 0;
if (root->Lchild == NULL&&root->Rchild == NULL) //
return 1;
ret =1+ tree_Node(root->Lchild) + tree_Node(root->Rchild);
return ret;
}
tree* search_Node(tree *root, datatype data) // data
{
assert(root);
tree *p=NULL;
if (root == NULL)
{
printf(" !
");
return NULL;
}
else
{
if (root->data == data)
return root;
if (root->Lchild != NULL)
{
p = search_Node(root->Lchild,data);
if (p != NULL)
return p;
}
if (root->Rchild != NULL)
{
p = search_Node(root->Rchild,data);
if (p != NULL)
return p;
}
return NULL; //
}
}
void Deal_tree(tree *root) //
{
assert(root);
if (root == NULL)
return;
Deal_tree(root->Lchild);
Deal_tree(root->Rchild);
free(root);
root = NULL;
}
ヘッダファイルh
#ifndef __BITTREE_H__
#define __BITTREE_H__
#define _CRT_SECURE_NO_WARNINGS
#define MAX 100
typedef int datatype;
typedef struct Bittree
{
datatype data;
struct Bittree *Lchild;
struct Bittree *Rchild;
}tree;
typedef struct
{
datatype Elem_data[MAX];
int length;
}Tree_arry;
tree *Tier_creat(tree* root); // root
tree *DLR_creat(tree* root); //
tree *LDR_creat(tree* root); //
tree *RLD_creat(tree* root); //
tree *Creat(tree* root,tree*(*ptree)(tree *root)); //
void Print_Tree(tree *root, void(*ptree)(tree *root)); //
void DLR_Print(tree *root); //
void LDR_Print(tree *root); //
void RLD_Print(tree *root); //
void Tie_Print(tree *root); //
int Deep_tree(tree *root); //
int Node_du(tree *root); //
int tree_Node(tree *root); //
tree* search_Node(tree *root, datatype data); // data
void Deal_tree(tree *root); //
#endif __BITTREE_H__
テストファイルc:
#include "Bittree.h"
#include <stdio.h>
#include <stdlib.h>
void Init()
{
printf("1:
");
printf("2:
");
printf("3:
");
printf("4:
");
printf("5:
");
printf("0:
");
}
void Init_Print()
{
printf("0: .
");
printf("1: .
");
printf("2: .
");
printf("3: .
");
}
void Init_Creat()
{
printf("0: .
");
printf("1: .
");
printf("2: .
");
printf("3: .
");
}
void test()
{
int ret;
int key=0;
int choose;
datatype data=0;
tree *root = NULL;
tree *node = NULL;
tree* (*Tree_C[4])(tree *root) = { 0 }; //
void(*Tree_p[4])(tree *root) = { 0 }; //
Tree_C[0] = Tier_creat;
Tree_C[1] = DLR_creat;
Tree_C[2] = LDR_creat;
Tree_C[3] = RLD_creat;
Tree_p[0] = Tie_Print;
Tree_p[1] = DLR_Print;
Tree_p[2] = LDR_Print;
Tree_p[3] = DLR_Print;
while (1)
{
printf(" :");
scanf("%d", &key);
switch (key)
{
case 0:
printf("Program Over!!
");
exit(EXIT_FAILURE);
break;
case 1:
Init_Creat();
do
{
printf(" :");
scanf("%d", &choose);
} while (choose <= 0 && choose >= 3);
root = Creat(root, Tree_C[choose]);
break;
case 2:
Init_Print();
do
{
printf(" :");
scanf("%d", &choose);
} while (choose <= 0 && choose >= 3);
Print_Tree(root, Tree_p[choose]);
break;
case 3:
ret = Deep_tree(root);
printf(" :%d
", ret);
break;
case 4:
printf(" :");
scanf("%d", &data);
node=search_Node(root, data);
if (node == NULL)
{
printf(" !
");
exit(EXIT_FAILURE);
}
ret = Node_du(node);
printf(" %d :%d
",data, ret);
break;
case 5:
Deal_tree(root);
printf(" !
");
break;
}
}
}
int main()
{
Init();
test();
system("pause");
return 0;
}
上記の記述に関連する問題があれば、ご指摘ください[email protected]