以下にプログラム例を示す.
1 //============= ノードを表す構造体 ==============================
2 typedef struct node_tag{
3 int value;
4 struct node_tag *left;
5 struct node_tag *right;
6 }node;
7
8 //============== プロトタイプ宣言 =================================
9 extern node *creat_node(int new_data);
10 extern void insert_node(node *t_node, int new_data);
11 extern void delete_node(node *del_node, int del_data);
12 extern void print_tree(node *t_node, int depth);
13
14
15 extern node *root_tree;
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "b_tree.h"
4
5 node *root_tree=NULL;
6
7 //============== ノード作成関数 ==================================================
8 node *creat_node(int new_data)
9 {
10 node *new_node;
11
12 new_node=(node *)malloc(sizeof(node));
13
14 new_node->value = new_data;
15 new_node->left = NULL;
16 new_node->right = NULL;
17
18 return new_node;
19 }
20
21
22 //============== ノードをツリーに追加する関数 =======================================
23 void insert_node(node *t_node, int new_data)
24 {
25
26 if(t_node==NULL){ // rootが空の場合(最初のデータ)
27 root_tree = creat_node(new_data);
28 return;
29 }
30
31 if(t_node->value > new_data){
32 if(t_node->left == NULL){
33 t_node->left=creat_node(new_data);
34 }else{
35 insert_node(t_node->left, new_data);
36 }
37 }else{
38 if(t_node->right == NULL){
39 t_node->right=creat_node(new_data);
40 }else{
41 insert_node(t_node->right, new_data);
42 }
43 }
44
45 return;
46 }
47
48 //============== ノードをツリーから削減する関数 ======================================
49 void delete_node(node *del_node, int del_data)
50 {
51 node *parent=NULL; // 削除するノードの親
52 node *big=NULL; // 左の最大ノード
53 node *pbig=NULL; // 左の最大ノードの親
54 int flag=0;
55
56 // 削除するノードの探索
57 while(del_node!=NULL && del_node->value!=del_data){
58 if(del_node->value < del_data){
59 parent = del_node;
60 del_node = del_node -> right;
61 }else{
62 parent = del_node;
63 del_node = del_node -> left;
64 }
65 }
66
67 if(del_node==NULL){
68 printf("削除するデータがありません!\n");
69 return;
70 }
71
72 if(del_node->left == NULL){ // 削除するデータの左あるいは両方の子が無い
73 if(parent==NULL){ // 削除するデータがrootのとき
74 root_tree = del_node->right;
75 }else if(parent->value > del_data){ // 削除するデータが親の左の子
76 parent->left=del_node->right;
77 }else{ // 削除するデータが親の右の子
78 parent->right=del_node->right;
79 }
80 free(del_node);
81 return;
82 }
83
84 if(del_node->right == NULL){ // 削除するデータの右の子が無い
85 if(parent==NULL){ // 削除するデータがrootのとき
86 root_tree = del_node->right;
87 }else if(parent->value > del_data){
88 parent->left=del_node->left;
89 }else{ // 削除するデータが親の右の子
90 parent->right=del_node->left;
91 }
92 free(del_node);
93 return;
94 }
95
96 //--- 削除するデータに左右の子がある場合 ---
97
98 pbig=del_node;
99 big=del_node->left;
100
101 while(big->right != NULL){ // 左の最大値をもつノードの検索
102 pbig = big;
103 big = big->right;
104 flag = 1;
105 }
106
107 del_node->value = big->value;
108
109 if(flag == 0){
110 pbig->left = big->left;
111 }else{
112 pbig->right = big->left;
113 }
114
115 free(big);
116
117
118 }
119
120
121 //============== ええ加減にツリーを表示する関数 =====================================
122 void print_tree(node *t_node, int depth)
123 {
124 int i;
125
126 if(t_node==NULL)return;
127
128 print_tree(t_node->right,depth+1);
129
130 for(i=0; i<depth; i++)printf(" ");
131 printf("%d\n", t_node->value);
132
133 print_tree(t_node->left, depth+1);
134
135 return;
136 }
1 #include <stdio.h>
2 #include "b_tree.h"
3
4 int main(void)
5 {
6
7 insert_node(root_tree,5);
8 insert_node(root_tree,9);
9 insert_node(root_tree,3);
10 insert_node(root_tree,4);
11 insert_node(root_tree,7);
12 insert_node(root_tree,6);
13 insert_node(root_tree,10);
14 insert_node(root_tree,12);
15 insert_node(root_tree,2);
16 insert_node(root_tree,1);
17
18 printf("\n\n");
19 print_tree(root_tree, 0);
20
21 delete_node(root_tree, 9);
22 printf("\n\n");
23 print_tree(root_tree, 0);
24 return 0;
25 }
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
平成19年7月26日